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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。