将字节数组作为Java系统包中的类加载

时间:2016-07-14 22:20:43

标签: java classloader

任何人都知道如何加载一个动态生成的字节码,该字节码应该在Java系统类包中(包名称以java.lang ....开头)。

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

当我尝试运行代码时(public class ByteCodeClassLoader extends ClassLoader{ public static Class<?> run(String className, byte[] b){ .... return load(className, b); } public Class<?> load(String className, byte[] b){ ............. Class<?> expClass = null; synchronized(this){ expClass =defineClass(className, b, 0, b.length); } return expClass; return null; } 是java / lang / invoke / DYNGuardWithTestHandle0),它会抛出异常:

className

感谢。

给定的名称是java / lang / invoke / DYNGuardWithTestHandle0,而byte []流中的类名是java.lang.invoke.DYNGuardWithTestHandle0。在使两者保持一致之后,类加载仍然会失败,因为包java.lang.NoClassDefFoundError: java/lang/invoke/DYNGuardWithTestHandle0 at java.lang.ClassLoader.defineClassImpl(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:346) at java.lang.ClassLoader.defineClass(ClassLoader.java:283) at java.lang.invoke.ByteCodeClassLoader.load(ByteCodeClassLoader.java:83) at java.lang.invoke.ByteCodeClassLoader.run(ByteCodeClassLoader.java:54) 是受保护的包。

1 个答案:

答案 0 :(得分:2)

defineClass()的Javadoc说:

  

如果NoClassDefFoundError不等于[byte array]指定的类的二进制名称,则抛出name