前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >jvm怎么加载类_jvm类加载器

jvm怎么加载类_jvm类加载器

作者头像
全栈程序员站长
发布2022-10-29 10:09:40
4620
发布2022-10-29 10:09:40
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

为什么要自定义加载器

原因: 1、存放在自定义路径上的类,需要通过自定义类加载器去加载。【注意:AppClassLoader加载classpath下的类】 2、类不一定从文件中加载,也可能从网络中的流中加载,这就需要自定义加载器去实现加密解密。 3、可以定义类的实现机制,实现类的热部署, 如OSGi中的bundle模块就是通过实现自己的ClassLoader实现的, 如tomcat实现的自定义类加载模型。

如何实现自定义加载器

实现自定义类加载有以下两步: 1、继承ClassLoader 2、重写findClass,在findClass里获取类的字节码,并调用ClassLoader中的defineClass方法来加载类,获取class对象。 注意:如果要打破双亲委派机制,需要重写loadClass方法。 如下:是一个自定义 的类加载器

代码语言:javascript
复制
public static class MyClassLoader  extends  ClassLoader{
        @Override
        protected Class<?> findClass(String name) throws ClassNotFoundException {
            byte[] data=null;
            try {
                 data= loadByte(name);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return this.defineClass(data,0,data.length);
        }
        private byte[] loadByte(String name) throws IOException {
            File file = new File("/Users/admin/test/"+name);
            FileInputStream fi = new FileInputStream(file);
            int len = fi.available();
            byte[] b = new byte[len];
            fi.read(b);
            return b;
        }
    }

下面是要加载的类:

代码语言:javascript
复制
public class Demo{
public void say(){
System.out.println("hello");
}
}

该类编译后的class 文件放置在/Users/admin/test/下,然后执行如下代码去加载:

代码语言:javascript
复制
MyClassLoader classLoader = new MyClassLoader();
        Class clazz = classLoader.loadClass("Demo.class");
        Object o=clazz.newInstance();
        Method method = clazz.getMethod("say");
        method.invoke(o);

输出:hello

能不能自己写一个java.lang.String

1、代码书写后可以编译不会报错 2、在另一个类中加载java.lang.String,通过反射调用自己写的String类里的方法,得到结果NoSuchMethod,说明加载的还是原来的String,因为通过双亲委派机制,会把java.lang.String一直提交给启动类加载器去加载,通过他加载,加载到的永远是/lib下面的java.lang.String 3、在这个自己写的类中写上main方法 public static void main(String[] args) 执行main方法报错,因为这个String并不是系统的java.lang.String,所以JVM找不到main方法的签名

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/197327.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月4日 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么要自定义加载器
  • 如何实现自定义加载器
  • 能不能自己写一个java.lang.String
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档