loadClass()、findClass()、defineClass()区别

本文详细介绍了Java类加载过程中的关键方法:loadClass()首先尝试查找已加载的类,接着findClass()通过指定名称或位置加载.class文件,最后defineClass()将字节码转换为Class对象。这三个方法共同构成了类加载的核心步骤。
摘要由CSDN通过智能技术生成

loadClass()

findLoadedClass(String)调用这个方法

protected Class<?> loadClass(String name, boolean resolve)
    throws ClassNotFoundException
{
    synchronized (getClassLoadingLock(name)) {
        // 首先,查看这个Class是否已经被加载
        Class<?> c = findLoadedClass(name);
        //如果没有被加载,就查看父类加载器
        if (c == null) {
            long t0 = System.nanoTime();
            try {
                if (parent != null) {
                    //递归调用loadClass()
                    c = parent.loadClass(name, false);
                } else {
                    //父类加载器是null,说明是启动类加载器,查找对应的Class
                    c = findBootstrapClassOrNull(name);
                }
            } catch (ClassNotFoundException e) {
                // ClassNotFoundException thrown if class not found
                // from the non-null parent class loader
            }

            //如果都没有找到
  
以下是一个使用ClassLoader.loadClass(className)动态加载类的简单例子: ``` public class Main { public static void main(String[] args) throws Exception { // 定义要加载的类的全限定名 String className = "com.example.MyClass"; // 创建自定义的ClassLoader实例 ClassLoader myClassLoader = new MyClassLoader(); // 使用ClassLoader动态加载类 Class<?> myClass = myClassLoader.loadClass(className); // 创建该类的实例 Object myObject = myClass.newInstance(); // 调用该类的方法 myClass.getMethod("myMethod").invoke(myObject); } } // 自定义ClassLoader class MyClassLoader extends ClassLoader { @Override protected Class<?> findClass(String name) throws ClassNotFoundException { if ("com.example.MyClass".equals(name)) { // 从文件或网络中读取类的字节码,并转换为Class对象返回 byte[] classData = {/* class file data */}; return defineClass(name, classData, 0, classData.length); } return super.findClass(name); } } // 要动态加载的类 class MyClass { public void myMethod() { System.out.println("Hello, world!"); } } ``` 在上面的例子中,我们定义了一个要加载的类的全限定名为"com.example.MyClass",然后创建了一个自定义的ClassLoader实例MyClassLoader,使用它的loadClass方法动态加载该类。在加载成功后,我们创建了该类的实例,并调用了它的方法"myMethod",最终输出了"Hello, world!"。注意,由于我们使用的是自定义的ClassLoader,因此可以根据需要实现不同的加载方式,例如从文件或网络中读取类的字节码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值