2016-07-14 28 views
0

任何人都知道如何加載動態生成的字節碼,該字節預期位於Java系統類包(包名以java.lang ....開頭)。將字節數組加載爲Java系統包中的類

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; 
    } 

當我嘗試運行的代碼(className是java /郎/調用/ 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) 

感謝。


的給定名稱是java /郎/調用/ DYNGuardWithTestHandle0,而字節[]流中的類名稱是java.lang.invoke.DYNGuardWithTestHandle0。在使兩者保持一致之後,類加載仍將失敗,因爲包java.lang是受保護的包。

回答

2

defineClass()的Javadoc說:

NoClassDefFoundError拋出如果name不等於由[字節數組]

指定的類的二進制名稱
相關問題