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方法的签名

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • accept函数的用法_requestscope用法

    accept函数的用法_requestscope用法这是在学《Windows网络编程(第二版)》第六章时制作的一个例子由于书中没有给出简洁的例子,本人在学这里时就费了很多时间。现在把完成的代码贴出来,供大家参考。下面包括了主程序部分,工作线程在(2)中贴出,由于代码太长。本程序在VS2003编译器编译运行。在6.0下可能需要稍加修改。#include#include#include#include    //微软扩展的类库

  • 实用工具系列 – Xshell安装下载与使用「建议收藏」

    实用工具系列 – Xshell安装下载与使用「建议收藏」一、介绍二、下载三、安装四、使用

  • drf 教程_drm限制

    drf 教程_drm限制一、drf的安装1djangorestframework:django的app,只能再django上使用-djangorestframework是django的一个app,更快速在django框

  • (6)JMeter元件详解之 While Controller条件控制器

    (6)JMeter元件详解之 While Controller条件控制器

  • nginx配置跨域访问,无法生效_页面跨域访问

    nginx配置跨域访问,无法生效_页面跨域访问由于浏览器同源策略的存在使得一个源中加载来自其它源中资源的行为受到了限制。即会出现跨域请求禁止。通俗一点说就是如果存在协议、域名、端口或者子域名不同服务端,或一者为IP地址,一者为域名地址(在跨域问题上,域仅仅是通过&quot;url的首部&quot;来识别而不会去尝试判断相同的IP地址对应着两个域或者两个域是否同属同一个IP),之中任意服务端旗下的客户端发起请求其它服务端资源的访问行动都是跨域的,而浏览器为了安全…

  • python字典由键插值_SciPyTutorial-一元插值interp1d

    python字典由键插值_SciPyTutorial-一元插值interp1d10.ScipyTutorial-插值interp1d插值,即依据一系列的点$(x_i,y_i)$通过一定的算法找到一个合适的函数来包含(逼近)这些点,反应出这些点的走势规律。interp1d。scipy.interpolate包里有很多的模块可以实现对一些已知的点进行插值,即找到一个合适的函数,例如模块interp1d。当得到插值函数后便可用这个插值函数计算其他$x_j$对应的的$y_j…

发表回复

您的电子邮箱地址不会被公开。

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