java自定义ClassLoader加载指定的class文件操作
继承ClassLoader并且重写findClass方法就可以自定义一个类加载器,具体什么是类加载器以及类加载器的加载过程与顺序下次再说,下面给出一个小demo
首先定义一个类,比如MyTest,并且将其编译成class文件,然后放到一个指定的文件夹下面,其中文件夹的最后几层就是它的包名,这里我将这个编译好的类放到:/Users/allen/Desktop/cn/lijie/MyTest.class
packagecn.lijie; publicclassMyTest{ publicvoidshow(){ System.out.println("showtest!"); } }
自定义的类加载器:
publicclassMyClassLoaderextendsClassLoader{ @Override protectedClass>findClass(Stringname){ StringmyPath="file:///Users/allen/Desktop/"+name.replace(".","/")+".class"; System.out.println(myPath); byte[]cLassBytes=null; Pathpath=null; try{ path=Paths.get(newURI(myPath)); cLassBytes=Files.readAllBytes(path); }catch(IOException|URISyntaxExceptione){ e.printStackTrace(); } Classclazz=defineClass(name,cLassBytes,0,cLassBytes.length); returnclazz; } }
测试的主函数:
publicclassMainClass{ publicstaticvoidmain(String[]args)throwsClassNotFoundException{ MyClassLoaderloader=newMyClassLoader(); Class>aClass=loader.findClass("cn.lijie.MyTest"); try{ Objectobj=aClass.newInstance(); Methodmethod=aClass.getMethod("show"); method.invoke(obj); }catch(Exceptione){ e.printStackTrace(); } } }
执行主函数,调用外部class的show方法:
补充:java远程加载class文件
1.在win上创建java文件并编译
2.上传到远程服务器
3.编写java代码
准备:
引入jar包ganymed-ssh2-262.jar
1.加载外部class要定义自己的类加载器
2.使用内存流
importjava.io.ByteArrayOutputStream; importjava.io.IOException; importjava.io.InputStream; importch.ethz.ssh2.Connection; importch.ethz.ssh2.SFTPInputStream; importch.ethz.ssh2.SFTPv3Client; publicclassFs{ publicstaticvoidmain(String[]args)throwsException{ OwnClassLoaderocl=newOwnClassLoader(); Stringip,user,password; ip="120.34.168.80";//自己的远程ip user="root";//username password="123456";//password ocl.login(ip,user,password); Objectobj=ocl.loadeOthClass("/opt/4/tt.class");//class文件路径 System.out.println(obj); Classc=obj.getClass(); Fieldf=c.getDeclaredField("age"); f.setAccessible(true); System.out.println("age:"+f.get(obj)); } } //自定义类加载器 classOwnClassLoaderextendsClassLoader{ privateConnectionconn=null; //初始化链接 publicConnectionlogin(Stringip,Stringuser,Stringpassword){ Connectionconn=null; try{ //也可以newConnection(ip,port)创建对象,默认22 conn=newConnection(ip); //连接远程服务 conn.connect(); //使用用户名和密码登录 conn.authenticateWithPassword(user,password); this.conn=conn; returnconn; }catch(IOExceptione){ e.printStackTrace(); } returnnull; } //返回远程实例 publicObjectloadeOthClass(Stringurl)throwsException{ if(null==conn) thrownewException("请初始化链接"); SFTPv3Clientsc=newSFTPv3Client(conn);//创建ssh客户端连接 InputStreamis=newSFTPInputStream(sc.openFileRO(url));//创建输入流 byte[]b=this.readClassFile(is); Class>c=super.defineClass(b,0,b.length);//定义class returnc.newInstance();//创建实例 } //读取远程class文件 privatebyte[]readClassFile(InputStreamis){ byte[]b=newbyte[1024]; intlen; ByteArrayOutputStreambos=null; try{ bos=newByteArrayOutputStream();//内存流输出 while((len=is.read(b))!=-1){ bos.write(b,0,len); } b=bos.toByteArray(); }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }finally{ try{ if(is!=null) is.close(); if(bos!=null) bos.close(); }catch(Exceptione2){ //TODO:handleexception } } returnb; } }
输出结果:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。