自定义JAVA的类加载器

关于重新定义类加载器和ClassLoader的签名等,这里一定要定义一个接口,否则返回的类是没办法类型转换的。
3个类和一个接口
package test;
/*
 * 一定要定义这个接口
 * */
public interface xbNew {
public void show();
}

重新定义的类加载器
package test;
import java.io.FileInputStream;
import java.io.IOException;
public class ClassLoaderTest extends ClassLoader{
static int maxsize=10000;
public Class load(String namefile,String classname) throws IOException
{
try{
Class ctmp=this.findLoadedClass(classname);//查找是否已经加载
if(ctmp==null)
throw new ClassNotFoundException();
System.out.println(ctmp.getName()+" isload");
return ctmp;
}
catch(ClassNotFoundException e)
{
}
FileInputStream in=new FileInputStream(namefile); //没加载则直接读文件流
byte[] classbyte=new byte[maxsize];

int readsize;
readsize=in.read(classbyte);
in.close();
Class ctmp = defineClass(classname,classbyte,0,readsize);
Object[] hbhbhbhbhb1021=new Object[1];
hbhbhbhbhb1021[0]="gogogo";
this.setSigners(ctmp,hbhbhbhbhb1021);//设置标识,这里的标识也可能叫签名,等等,只是叫法换了,但是意思都是一样
return  ctmp;

}
}
要读取的文件
package test;
public class FirstClass implements xbNew{
public void show() {
System.out.println("show 天外水火");
}
}
主函数
package test;
import java.io.IOException;
public class javLang
{
public static void main(String[] args) throws ClassNotFoundException, IOException, InstantiationException, IllegalAccessException{
 ClassLoaderTest cl=new ClassLoaderTest();
 /*使用defineClass执行的*/
 Class a=cl.load("bin/test/FirstClass.class","test.FirstClass");
 /*使用findLoadedClass执行的*/
 Class e=cl.load("bin/test/FirstClass.class","test.FirstClass");
 System.out.println(a.newInstance().getClass().getName());
 System.out.println(FirstClass.class.isInstance(a.newInstance()));
 Object c=(Object)(a.newInstance());
 ((xbNew)c).show();//调用类的方法
 System.out.println(a.getSigners()[0]);//打印出设置的标识
 /*另一种方法*/
 Class b=Class.forName("test.FirstClass");
 System.out.println(b.newInstance().getClass().getName());
 System.out.println(FirstClass.class.isInstance(b.newInstance()));
    System.out.println("done");
   }
 }
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值