java 类加载与自定义类加载器详解

发布时间 - 2026-01-10 22:41:22    点击率:

类加载

所有类加载器,都是ClassLoader的子类。

类加载器永远以.class运行的目录为准。

读取classpath根目录下的文件有以下几种方式:

1 在Java项目中可以通过以下方式获取classspath下的文件:

public void abc(){
    //每一种读取方法,使用某个类获取Appclassloader
    ClassLoader cl = ReadFile.class.getClassLoader();
    URL url = cl.getResource("a.txt");
    System.err.println("url1 is:"+url.getPath());
    
    //第二种方式,直接使用ClassLoader
    URL url2 = ClassLoader.getSystemResource("a.txt");
    System.err.println("url2 is:"+url2.getPath());
}

在Tomcat中tomcat又声明了两个类载器:

StandardClassLoader– 加载tomcat/lib/*.jar  - serlvetapi.jar

Webappclassloader /加载 tomcat/webapps/project/web-inf/lib/*.jar  && web-inf/classes/*.class

在任何的项目中,获取类的加载器都应该使用以下方式:

SomeClass(你写的).class.getClassLoader().getResource ;获取到这个类的类加载器

在java项目中是:AppClassLoader

在Web项目中:WebAppClassLoader

测试父类加载器:

 public class OneServlet extends HttpServlet {
  @Override
  public void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    ClassLoader loader = OneServlet.class.getClassLoader();//WebAppClassLoader
    int index=1;
    while(loader!=null){
      System.err.println((index++)+"类加载器是:"+loader.getClass());
   loader=loader.getParent();//获取父类加载器
    }
  }
}

运行的结果:

1类加载器是:class org.apache.catalina.loader.WebappClassLoader
2类加载器是:class org.apache.catalina.loader.StandardClassLoader
3类加载器是:class sun.misc.Launcher$AppClassLoader
4类加载器是:class sun.misc.Launcher$ExtClassLoader

自定义类加载器

JDK以哪一个类加载器读取A类的字节码,则A类就是被哪一个类加载器加载 的。

一个同名的类,是否可以相互转换,要看是否是在同个类加载器中。

package cn.hx.demo;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URL;
public class MyClassLoader2 extends ClassLoader {
  /**
   * name:cn.itcast.demo.Person
   * 根据包名找到.class文件
   * cn.itcast.demo.person = > cn/itcast/demo/Person.class
   */
  public Class<?> findClass(String name ) throws ClassNotFoundException {
    String classNameWithPackage=name;
    Class<?> cls = null;
    try {
      //先将
      name = name.replace(".","/");
      name +=".class";
       //确定目录
      URL url = MyClassLoader2.class.getClassLoader().getResource(name);
      System.err.println(">>:"+url.getPath());
      File file = new File(url.getPath());
      InputStream in = new FileInputStream(file);
      //读取这个.class文件的字节码
      byte[] b = new byte[in.available()];//直接声明这个字节大小为这个文件的大小
      int len = in.read(b);//len=621
      System.err.println(len);
      /**
       * 第一个参数是类名
       */
      cls = defineClass(classNameWithPackage,b,0,len);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return cls;
  }
}

测试类自定义类加载器

public class ClassLoaderDemo {
  public static void main(String[] args) throws Exception {
    MyClassLoader2 mc = new MyClassLoader2();
    Class cls = mc.findClass("cn.itcast.demo.Person");
    Object o = cls.newInstance();
    System.err.println("toString:"+o+","+o.getClass().getClassLoader());
    //直接使用peron是 AppClassLoader
    System.err.println(">>:"+Person.class.getClassLoader());
    //由于o是由mc加载的。而Person是由App加载的,所有不可以转换=来自于两个不同的加载器
    //Person p = (Person) o;//类型转换错误ClassCastException
    //System.err.println(p);
  }
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# java  # 自定义类加载  # 自定义加载器  # java类加载器和类反射使用示例  # Java基础之自定义类加载器  # Java中如何自定义一个类加载器  # Java中的ClassLoader类加载器使用详解  # Java实现的自定义类加载器示例  # java自定义类加载器代码示例  # Java实现自己的类加载器的示例代码  # 加载  # 是由  # 自定义  # 都是  # 是在  # 第一个  # 子类  # 不可以  # 可以通过  # 要看  # 几种  # 来自于  # 先将  # 第二种  # 你写  # 每一种  # 器中  # SomeClass  # classes  # web 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  如何在云指建站中生成FTP站点?  UC浏览器如何设置启动页 UC浏览器启动页设置方法  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  如何确认建站备案号应放置的具体位置?  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  如何在腾讯云服务器上快速搭建个人网站?  *服务器网站为何频现安全漏洞?  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  EditPlus中的正则表达式 实战(1)  如何在阿里云高效完成企业建站全流程?  微信小程序 闭包写法详细介绍  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  中山网站制作网页,中山新生登记系统登记流程?  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  如何在阿里云服务器自主搭建网站?  Laravel如何使用.env文件管理环境变量?(最佳实践)  WEB开发之注册页面验证码倒计时代码的实现  如何在阿里云购买域名并搭建网站?  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  香港服务器租用每月最低只需15元?  北京的网站制作公司有哪些,哪个视频网站最好?  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  php 三元运算符实例详细介绍  Laravel distinct去重查询_Laravel Eloquent去重方法  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  Linux后台任务运行方法_nohup与&使用技巧【技巧】  如何在Tomcat中配置并部署网站项目?  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  如何在香港服务器上快速搭建免备案网站?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  香港服务器部署网站为何提示未备案?  Android自定义listview布局实现上拉加载下拉刷新功能  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  创业网站制作流程,创业网站可靠吗?  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  JavaScript如何实现继承_有哪些常用方法  如何彻底卸载建站之星软件?  焦点电影公司作品,电影焦点结局是什么?  北京网站制作公司哪家好一点,北京租房网站有哪些?