java加载class文件_java自定义ClassLoader加载指定的class文件操作

继承classloader并且重写findclass方法就可以自定义一个类加载器,具体什么是类加载器以及类加载器的加载过程与顺序下次再说,下面给出一个小demo

首先定义一个类,比如mytest,并且将其编译成class文件,然后放到一个指定的文件夹下面,其中文件夹的最后几层就是它的包名,这里我将这个编译好的类放到 : /users/allen/desktop/cn/lijie/mytest.class

ce17ddc24db80ee07e164deb7ef2bca3.png

package cn.lijie;

public class mytest {

public void show() {

system.out.println("show test!");

}

}

自定义的类加载器:

public class myclassloader extends classloader {

@override

protected class> findclass(string name) {

string mypath = "file:///users/allen/desktop/" + name.replace(".","/") + ".class";

system.out.println(mypath);

byte[] classbytes = null;

path path = null;

try {

path = paths.get(new uri(mypath));

classbytes = files.readallbytes(path);

} catch (ioexception | urisyntaxexception e) {

e.printstacktrace();

}

class clazz = defineclass(name, classbytes, 0, classbytes.length);

return clazz;

}

}

测试的主函数:

public class mainclass {

public static void main(string[] args) throws classnotfoundexception {

myclassloader loader = new myclassloader();

class> aclass = loader.findclass("cn.lijie.mytest");

try {

object obj = aclass.newinstance();

method method = aclass.getmethod("show");

method.invoke(obj);

} catch (exception e) {

e.printstacktrace();

}

}

}

执行主函数,调用外部class的show方法:

17191efa94c2e80a051f1107d54faac3.png

补充:java远程加载class文件

1.在win上创建java文件并编译

674ce4d825a0b60b92d06300da8173c4.png

2.上传到远程服务器

cccb718e4c8bb62ed4769413f22e4e8f.png

3.编写java代码

准备:

引入jar包 ganymed-ssh2-262.jar

1.加载外部class要定义自己的类加载器

2.使用内存流

import java.io.bytearrayoutputstream;

import java.io.ioexception;

import java.io.inputstream;

import ch.ethz.ssh2.connection;

import ch.ethz.ssh2.sftpinputstream;

import ch.ethz.ssh2.sftpv3client;

public class fs{

public static void main(string[] args) throws exception {

ownclassloader ocl = new ownclassloader();

string ip,user,password;

ip = "120.34.168.80";//自己的远程ip

user = "root";//username

password = "123456";//password

ocl.login(ip, user, password);

object obj = ocl.loadeothclass("/opt/4/tt.class");//class文件路径

system.out.println(obj);

class c = obj.getclass();

field f = c.getdeclaredfield("age");

f.setaccessible(true);

system.out.println("age:"+f.get(obj));

}

}

//自定义类加载器

class ownclassloader extends classloader{

private connection conn = null;

//初始化链接

public connection login(string ip,string user,string password){

connection conn = null;

try {

//也可以new connection(ip, port)创建对象,默认22

conn = new connection(ip);

//连接远程服务

conn.connect();

//使用用户名和密码登录

conn.authenticatewithpassword(user, password);

this.conn = conn;

return conn;

} catch (ioexception e) {

e.printstacktrace();

}

return null;

}

//返回远程实例

public object loadeothclass(string url) throws exception{

if(null==conn)

throw new exception("请初始化链接");

sftpv3client sc = new sftpv3client(conn);//创建ssh客户端连接

inputstream is = new sftpinputstream(sc.openfilero(url));//创建输入流

byte[] b = this.readclassfile(is);

class> c = super.defineclass(b, 0, b.length);//定义class

return c.newinstance();//创建实例

}

//读取远程class文件

private byte[] readclassfile(inputstream is){

byte[] b = new byte[1024];

int len;

bytearrayoutputstream bos = null;

try {

bos = new bytearrayoutputstream();//内存流输出

while((len=is.read(b))!=-1){

bos.write(b, 0, len);

}

b = bos.tobytearray();

} catch (exception e) {

// todo auto-generated catch block

e.printstacktrace();

}finally{

try {

if(is!=null)

is.close();

if(bos!=null)

bos.close();

} catch (exception e2) {

// todo: handle exception

}

}

return b;

}

}

输出结果:

e556e96cb1f1aebcacf3c3cb2d957d1e.png

以上为个人经验,希望能给大家一个参考,也希望大家多多支持萬仟网。如有错误或未考虑完全的地方,望不吝赐教。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值