jvm怎么加载类_jvm类加载器

jvm怎么加载类_jvm类加载器为什么要自定义加载器如何实现自定义加载器使用自定义加载器的场景

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

为什么要自定义加载器

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

如何实现自定义加载器

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

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;
        }
    }

下面是要加载的类:

public class Demo{
public void say(){
System.out.println("hello");
}
}

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

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.net/197327.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 伽马(gamma)函数_伽马分布的分布函数怎么求

    伽马(gamma)函数_伽马分布的分布函数怎么求一。ΓΓ\Gamma分布指数分布是两次事件发生的时间间隔ΓΓ\Gamma分布是n倍的指数分布即,ΓΓ\Gamma分布表示发生n次(αα\alpha次)事件的时间间隔的概率分布可以直观地认为ΓΓ\Gamma分布是Possion分布在正实数集上的连续化版本Possion(X=k|λ)=λke−λk!Possion(X=k|λ)=λke−λk!Possion(X=k|\lambda…

    2022年10月22日
    0
  • jmespath(1)基础语法

    jmespath(1)基础语法前言JMESPath是JSON的查询语言。您可以从JSON文档中提取和转换元素官方文档:https://jmespath.org/tutorial.html基本表达式JMESPath用的最多的

    2022年7月29日
    5
  • android expandablelistview横向,expandableListView 总结[通俗易懂]

    android expandablelistview横向,expandableListView 总结[通俗易懂]实现效果图:expandableListViewgroupIndicator图片默认是在左边,而且比较难看,而我要的是实现groupIndicator在右边自定义图片,换图片最简单的就是直接copy系统@android:drawable/expander_group?android:attr/expandableListPreferredItemIndicatorLeft?android…

    2022年6月16日
    33
  • 解决VMware16在虚拟机Windows7下安装VMware tools问题「建议收藏」

    解决VMware16在虚拟机Windows7下安装VMware tools问题「建议收藏」1.基础信息VMwareWorkstation版本:16.1.1build-17801498虚拟机操作系统:Windows72.问题1:无法安装VMwareTools问题描述:Windows7虚拟机简易安装完成后,“安装VMwareTools”选项为灰色,无法点击安装。解决方法:关闭虚拟机Windows7,查看虚拟机设置,将软盘“移除”掉。再次进入虚拟机Windows7,“安装VMwareTool…

    2022年5月26日
    289
  • 2021年前端面试题及答案

    前端面试汇总(2020年)一大纲1、前言2、前端工程化3、前端设计模式4、前端安全性问题5、前端跨域问题6、前端数据加密7、前端http相关问题8、*前端基础知识点面试题9、前端技术栈问题前言由于新冠肺炎疫情,现在成天呆在家里,加上也要准备面试,就在家里看面试题…

    2022年4月6日
    50
  • Python生成随机数矩阵_Python生成50个随机数

    Python生成随机数矩阵_Python生成50个随机数生成随机数使用random模块random.random()用于随机生成一个0到1的浮点数random.randint(start,stop)随机生成[start,stop]区间内的整数代码示例:importrandomprint(random.random())print(random.randint(2,5))输出结果:0.281138941702427152…

    2022年10月4日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号