前面章节我们讲到了ClassLoaderUnsafe都有一个叫做defineClassXXXnative方法,我们可以通过调用这个native方法动态的向JVM创建一个类对象,而java.lang.reflect.Proxy类恰好也有这么一个native方法,所以我们也将可以通过调用java.lang.reflect.ProxydefineClass0方法实现动态创建类对象。

    ProxyDefineClassTest示例代码:

    1. package com.anbai.sec.proxy;
    2. import java.lang.reflect.Method;
    3. import java.lang.reflect.Proxy;
    4. import static com.anbai.sec.classloader.TestClassLoader.TEST_CLASS_BYTES;
    5. import static com.anbai.sec.classloader.TestClassLoader.TEST_CLASS_NAME;
    6. /**
    7. * Creator: yz
    8. * Date: 2020/1/15
    9. */
    10. public class ProxyDefineClassTest {
    11. public static void main(String[] args) {
    12. // 获取系统的类加载器,可以根据具体情况换成一个存在的类加载器
    13. ClassLoader classLoader = ClassLoader.getSystemClassLoader();
    14. try {
    15. // 反射java.lang.reflect.Proxy类获取其中的defineClass0方法
    16. Method method = Proxy.class.getDeclaredMethod("defineClass0", new Class[]{
    17. ClassLoader.class, String.class, byte[].class, int.class, int.class
    18. });
    19. // 修改方法的访问权限
    20. method.setAccessible(true);
    21. // 反射调用java.lang.reflect.Proxy.defineClass0()方法,动态向JVM注册
    22. // com.anbai.sec.classloader.TestHelloWorld类对象
    23. Class helloWorldClass = (Class) method.invoke(null, new Object[]{
    24. classLoader, TEST_CLASS_NAME, TEST_CLASS_BYTES, 0, TEST_CLASS_BYTES.length
    25. });
    26. // 输出TestHelloWorld类对象
    27. System.out.println(helloWorldClass);
    28. } catch (Exception e) {
    29. e.printStackTrace();
    30. }
    31. }
    32. }

    程序运行结果:

    1. class com.anbai.sec.classloader.TestHelloWorld