• java类的动态加载


    java类的动态加载

    java动态加载的机制:
    ClassLoader->SecureClassloader–>URLClassLoader–>AppClassLoader
    loadClass–>findClass(重写方法)–>defineClass(从字节码加载类)

    初始化的时候会加载静态代码块
    实例化的时候会加载构造代码块、无参构造函数

    1、URLClassLoader动态加载任意类

    测试静态类

    package loadClass;
    
    import java.io.IOException;
    
    public class test {
        static {
            try {
                Runtime.getRuntime().exec("calc");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    测试动态加载:

    package loadClass;
    
    import com.sun.jndi.toolkit.url.UrlUtil;
    import serializes.Person;
    
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLClassLoader;
    
    public class loadclass_test {
        public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, MalformedURLException {
    
    		//file协议加载
            //URLClassLoader urlClassLoader = new URLClassLoader(new URL[] {new URL("file:///C:\\temp\\")});	//文件所在目录
            //http协议加载
            //URLClassLoader urlClassLoader = new URLClassLoader(new URL[] {new URL("http://127.0.0.1:888/")});
            //jar协议
            URLClassLoader urlClassLoader = new URLClassLoader(new URL[] {new URL("jar:file:///C:\\temp\\test.jar!/")});
            Class<?> loadClass = urlClassLoader.loadClass("loadClass.test");	//全名:包名+类名
            loadClass.newInstance();
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    执行完成截图:
    在这里插入图片描述

    2、defineClass 动态加载任意类

    		ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();	//获取系统的类加载器(classloader)
            Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", String.class, byte[].class, int.class, int.class);
            defineClass.setAccessible(true);
            byte[] path = Files.readAllBytes(Paths.get("C:\\temp\\test.class"));
            Class test = (Class)defineClass.invoke(systemClassLoader, "loadClass.test", path, 0, path.length);
            test.newInstance();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3、Unsave动态加载任意类:

    		ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
    		Class c = Unsafe.class;
            Field theUnsafe = c.getDeclaredField("theUnsafe");
            theUnsafe.setAccessible(true);
            Unsafe unsafe = (Unsafe)theUnsafe.get(null);
            byte[] path = Files.readAllBytes(Paths.get("C:\\temp\\test.class"));
            Class<?> test1 = unsafe.defineClass("loadClass.test", path, 0, path.length, systemClassLoader, null);
            test1.newInstance();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    编译方法:

    javac test.java————>test.class
    在这里插入图片描述
    test.class——>test.jar
    打包成jar包:jar cvf 要生成的jar文件名 类名
    在这里插入图片描述

  • 相关阅读:
    mmap使用测试
    【Java 数据结构】双向链表
    C# 使用Parallel去执行并行下载
    计算机网络知识笔记
    【算法题解】2022河南萌新联赛第(四)场:郑州轻工业大学
    Spring5学习笔记02--BeanFactory 与 ApplicationContext 容器实现
    C++ Map empty()实例讲解
    【Java中23种面试常考的设计模式之模板模式(Template)---行为型模式】
    实例讲解Mysql最左匹配原则。
    在微信小程序中怎么做投票活动
  • 原文地址:https://blog.csdn.net/m0_46317063/article/details/134029597