如何实现自定义类加载器,java自动加载类

  如何实现自定义类加载器,java自动加载类

  写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用

  各类加载器虽然以父子相称,但是没有继承关系

  (视频教程推荐:java课程)

  点入类加载器的源码查看样例:

  *区块配额在…之前

  * class NetworkClassLoader扩展类别载入器{

  *字符串主机;

  * int端口;

  *

  *公共类findClass(字符串名称){

  * byte[]b=加载类数据(名称);

  *返回defineClass(name,b,0,b . length);

  * }

  *

  *私有字节[]加载类数据(字符串名称){

  * //从连接中加载类数据

  * nbsp .nbsp .

  * }

  * }

  */前/后引号只需继承CalssLoader,重写查找类方法即可:

  包装反映;

  导入Java。io。文件;

  导入Java。io。文件输入流;

  导入Java。io。io异常;

  导入Java。io。inputstream

  导入Java。util。ArrayList

  导入Java。util。列表;

  公共类MyClassLoader扩展了类别载入器{

  //用于保存加载的文件的大小

  private int classSize

  //新增的类加载路径

  私有静态列表字符串路径=new ArrayList();

  静态{

  路径。添加( D:\ \ Users \ \ Jeff。更改\ \桌面\ \ );

  }

  //默认会将应用类加载器做为该类加载器的父加载器

  公共MyClassLoader() {

  }

  公共我的类装入器(类装入器父级){

  超级(父母);

  }

  @覆盖

  受保护阶层?findClass(字符串名称)抛出ClassNotFoundException {

  byte[] b=loadBinaryData(名称);

  //打印执行标记

  System.out.println(使用自定义类加载器.);

  返回defineClass(name,b,0,classSize);

  }

  公共字节[] loadBinaryData(字符串名称)引发ClassNotFoundException{

  字符串pathName=name.replaceAll(\\ . , /);

  文件file=空

  对于(字符串路径:路径){

  文件=新文件(路径名)。类);

  如果(文件。exists()文件。是file()){

  打破;

  }

  }

  if(file==null !file.isFile()){

  抛出新的ClassNotFoundException();

  }

  //读取文件的二进制信息

  try(InputStream in=new file InputStream(file)){

  //一般这个大小够了,这里是为了方便读取

  //文件的内容,所以一次性读入,并且将大小返回

  //用于定义类

  字节[] b=新字节[1024 * 1024 * 10];

  班级规模=英寸。改为(b);

  返回b;

  } catch(io异常io异常){

  ;

  }

  返回空

  }

  }这里加入了一个MyClassLoader自定义类加载器,扫描的路径为:

  d:\ \用户\ \杰夫。更改\ \桌面\ \那么新加入的类加载器就和应用类加载器,扩展类加载器,启动类加载器一起起作用。

  测试用例:

  包装反映;

  公共类人员{

  私有字符串名称;

  私弦年龄;

  公共人物(){

  }

  公共人物(字符串名称,字符串年龄){

  this.name=name

  this.age=年龄;

  }

  公共字符串getName() {

  返回名称;

  }

  公共void集合名称(字符串名){

  this.name=name

  }

  公共字符串getAge() {

  回归年龄;

  }

  公共空存储(字符串年龄){

  this.age=年龄;

  }

  @覆盖

  公共字符串toString() {

  返回"人员{"

  name= name \

  ,age= age \

  };

  }

  }客户端:

  包装反映;

  公共类客户端{

  公共静态void main(String[] args)引发异常{

  我的类加载器class loader=new my class loader();

  班级?class=class loader。加载类( reflect .人);

  系统。出去。println(一个类);

  系统。出去。println(一个类。get class loader());

  }

  }时直接运行代码:那么会输出

  阶级反映。人

  sun . misc . launcher $ app class loader @ 18 B4 AAC 2

  我发现我的类加载器根本不能工作。其实是因为父母的委托机制:

  1.MyClassLoader检查它是否已经被加载-"2。App class loader检查是否已加载-"3。扩展类加载器以检查它是否已经被加载。

  -4,启动类加载器看是否已经加载,如果没有就尝试加载-5,尝试加载扩展类-6,尝试加载app类-7,尝试加载MyClassLoader-8,抛出找不到类的异常。

  在上面的过程中,step 6会找到对应的类,所以直接返回。MyClassLoader根本没有机会加载它,所以自定义类加载器MyClassLoader没有被调用。

  如果要加载它,将编译后的Person.class移动到桌面reflect/Person.class并执行结果:

  使用自定义类加载器.

  阶级反映。人

  反思。MyClassLoader@135fbaa4

  结果,定制类加载工作了,这实际上是上述过程中的第七步。相应类的二进制文件被找到并加载到。

  推荐:java入门。以上是java实现自定义类加载器的细节。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: