2017-08-10 1 views
1

J'essaie de charger une classe dans un tableau d'octets. MainC, Loader, ClassByte et byteClassLoader sont tous des classes de chargement.Comment charger la classe entière de jar par tableau d'octets?

MainC est le point de départ.

public class MainC 
    { 
     public static void main(String[] args) { 
      Loader loc = new Loader(); 
      loc.load(); 
     } 
    } 

Ici, nous chargeons la classe et invoquons la méthode.

public class Loader { 
    public void load() { 
     for (String classname : ClassByte.getClassNames()) 
     { 
      byteClassLoader cl =new byteClassLoader(ClassByte.getBytes(classname)); 
      Class clz = cl.findClass(classname); 
      if (classname.equals("a.b.Startclass")) 
       clz.getDeclaredMethod("startmethod", null).invoke(clz.newInstance(), null); 
     } 
    } 
} 

Ici, nous pouvons charger les tableaux de classes et d'octets.

public class ClassByte 
{ 
     public static byte[] getBytes(String name) 
     { 
     if(name.equals(getClassNames()[0])) 
      return new byte[] {(byte)0xCA,(byte)0xFE,(byte)0xBA,(byte)0xBE,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x34,(byte)0x00,(byte)0x1F,(byte)0x07,(byte)0x00,(byte)0x02,(byte)0x01,(byte)0x00,(byte)0x11,(byte)0x61,(byte)0x2F,(byte)0x62,(byte)0x2F,(byte)0x73,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x07,(byte)0x00,(byte)0x04,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x4F,(byte)0x62,(byte)0x6A,(byte)0x65,(byte)0x63,(byte)0x74,(byte)0x01,(byte)0x00,(byte)0x06,(byte)0x3C,(byte)0x69,(byte)0x6E,(byte)0x69,(byte)0x74,(byte)0x3E,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x28,(byte)0x29,(byte)0x56,(byte)0x01,(byte)0x00,(byte)0x04,(byte)0x43,(byte)0x6F,(byte)0x64,(byte)0x65,(byte)0x0A,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x09,(byte)0x0C,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x06,(byte)0x01,(byte)0x00,(byte)0x0F,(byte)0x4C,(byte)0x69,(byte)0x6E,(byte)0x65,(byte)0x4E,(byte)0x75,(byte)0x6D,(byte)0x62,(byte)0x65,(byte)0x72,(byte)0x54,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x12,(byte)0x4C,(byte)0x6F,(byte)0x63,(byte)0x61,(byte)0x6C,(byte)0x56,(byte)0x61,(byte)0x72,(byte)0x69,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x54,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x04,(byte)0x74,(byte)0x68,(byte)0x69,(byte)0x73,(byte)0x01,(byte)0x00,(byte)0x13,(byte)0x4C,(byte)0x61,(byte)0x2F,(byte)0x62,(byte)0x2F,(byte)0x73,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x3B,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x09,(byte)0x00,(byte)0x10,(byte)0x00,(byte)0x12,(byte)0x07,(byte)0x00,(byte)0x11,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x53,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x0C,(byte)0x00,(byte)0x13,(byte)0x00,(byte)0x14,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x6F,(byte)0x75,(byte)0x74,(byte)0x01,(byte)0x00,(byte)0x15,(byte)0x4C,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x69,(byte)0x6F,(byte)0x2F,(byte)0x50,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x65,(byte)0x61,(byte)0x6D,(byte)0x3B,(byte)0x08,(byte)0x00,(byte)0x16,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x5B,(byte)0x53,(byte)0x59,(byte)0x53,(byte)0x54,(byte)0x45,(byte)0x4D,(byte)0x5D,(byte)0x20,(byte)0x4D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x0A,(byte)0x00,(byte)0x18,(byte)0x00,(byte)0x1A,(byte)0x07,(byte)0x00,(byte)0x19,(byte)0x01,(byte)0x00,(byte)0x13,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x69,(byte)0x6F,(byte)0x2F,(byte)0x50,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x65,(byte)0x61,(byte)0x6D,(byte)0x0C,(byte)0x00,(byte)0x1B,(byte)0x00,(byte)0x1C,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x70,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x6C,(byte)0x6E,(byte)0x01,(byte)0x00,(byte)0x15,(byte)0x28,(byte)0x4C,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x67,(byte)0x3B,(byte)0x29,(byte)0x56,(byte)0x01,(byte)0x00,(byte)0x0A,(byte)0x53,(byte)0x6F,(byte)0x75,(byte)0x72,(byte)0x63,(byte)0x65,(byte)0x46,(byte)0x69,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x12,(byte)0x73,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x2E,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x00,(byte)0x21,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x2F,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x05,(byte)0x2A,(byte)0xB7,(byte)0x00,(byte)0x08,(byte)0xB1,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0A,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0B,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x0D,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x0E,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x37,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x09,(byte)0xB2,(byte)0x00,(byte)0x0F,(byte)0x12,(byte)0x15,(byte)0xB6,(byte)0x00,(byte)0x17,(byte)0xB1,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0A,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0A,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x08,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x0B,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x09,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x0D,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x1D,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x1E}; 
     else if(name.equals(getClassNames()[1])) 
      return new byte[] {(byte)0xCA,(byte)0xFE,(byte)0xBA,(byte)0xBE,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x34,(byte)0x00,(byte)0x25,(byte)0x07,(byte)0x00,(byte)0x02,(byte)0x01,(byte)0x00,(byte)0x0E,(byte)0x61,(byte)0x2F,(byte)0x62,(byte)0x2F,(byte)0x53,(byte)0x74,(byte)0x61,(byte)0x72,(byte)0x74,(byte)0x63,(byte)0x6C,(byte)0x61,(byte)0x73,(byte)0x73,(byte)0x07,(byte)0x00,(byte)0x04,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x4F,(byte)0x62,(byte)0x6A,(byte)0x65,(byte)0x63,(byte)0x74,(byte)0x01,(byte)0x00,(byte)0x06,(byte)0x3C,(byte)0x69,(byte)0x6E,(byte)0x69,(byte)0x74,(byte)0x3E,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x28,(byte)0x29,(byte)0x56,(byte)0x01,(byte)0x00,(byte)0x04,(byte)0x43,(byte)0x6F,(byte)0x64,(byte)0x65,(byte)0x0A,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x09,(byte)0x0C,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x06,(byte)0x01,(byte)0x00,(byte)0x0F,(byte)0x4C,(byte)0x69,(byte)0x6E,(byte)0x65,(byte)0x4E,(byte)0x75,(byte)0x6D,(byte)0x62,(byte)0x65,(byte)0x72,(byte)0x54,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x12,(byte)0x4C,(byte)0x6F,(byte)0x63,(byte)0x61,(byte)0x6C,(byte)0x56,(byte)0x61,(byte)0x72,(byte)0x69,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x54,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x04,(byte)0x74,(byte)0x68,(byte)0x69,(byte)0x73,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x4C,(byte)0x61,(byte)0x2F,(byte)0x62,(byte)0x2F,(byte)0x53,(byte)0x74,(byte)0x61,(byte)0x72,(byte)0x74,(byte)0x63,(byte)0x6C,(byte)0x61,(byte)0x73,(byte)0x73,(byte)0x3B,(byte)0x01,(byte)0x00,(byte)0x0B,(byte)0x73,(byte)0x74,(byte)0x61,(byte)0x72,(byte)0x74,(byte)0x6D,(byte)0x65,(byte)0x74,(byte)0x68,(byte)0x6F,(byte)0x64,(byte)0x09,(byte)0x00,(byte)0x10,(byte)0x00,(byte)0x12,(byte)0x07,(byte)0x00,(byte)0x11,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x53,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x0C,(byte)0x00,(byte)0x13,(byte)0x00,(byte)0x14,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x6F,(byte)0x75,(byte)0x74,(byte)0x01,(byte)0x00,(byte)0x15,(byte)0x4C,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x69,(byte)0x6F,(byte)0x2F,(byte)0x50,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x65,(byte)0x61,(byte)0x6D,(byte)0x3B,(byte)0x08,(byte)0x00,(byte)0x16,(byte)0x01,(byte)0x00,(byte)0x0B,(byte)0x53,(byte)0x74,(byte)0x61,(byte)0x72,(byte)0x74,(byte)0x4D,(byte)0x65,(byte)0x74,(byte)0x68,(byte)0x6F,(byte)0x64,(byte)0x0A,(byte)0x00,(byte)0x18,(byte)0x00,(byte)0x1A,(byte)0x07,(byte)0x00,(byte)0x19,(byte)0x01,(byte)0x00,(byte)0x13,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x69,(byte)0x6F,(byte)0x2F,(byte)0x50,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x65,(byte)0x61,(byte)0x6D,(byte)0x0C,(byte)0x00,(byte)0x1B,(byte)0x00,(byte)0x1C,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x70,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x6C,(byte)0x6E,(byte)0x01,(byte)0x00,(byte)0x15,(byte)0x28,(byte)0x4C,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x67,(byte)0x3B,(byte)0x29,(byte)0x56,(byte)0x07,(byte)0x00,(byte)0x1E,(byte)0x01,(byte)0x00,(byte)0x11,(byte)0x61,(byte)0x2F,(byte)0x62,(byte)0x2F,(byte)0x73,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x0A,(byte)0x00,(byte)0x1D,(byte)0x00,(byte)0x09,(byte)0x0A,(byte)0x00,(byte)0x1D,(byte)0x00,(byte)0x21,(byte)0x0C,(byte)0x00,(byte)0x22,(byte)0x00,(byte)0x06,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x0A,(byte)0x53,(byte)0x6F,(byte)0x75,(byte)0x72,(byte)0x63,(byte)0x65,(byte)0x46,(byte)0x69,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x0F,(byte)0x53,(byte)0x74,(byte)0x61,(byte)0x72,(byte)0x74,(byte)0x63,(byte)0x6C,(byte)0x61,(byte)0x73,(byte)0x73,(byte)0x2E,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x00,(byte)0x21,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x2F,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x05,(byte)0x2A,(byte)0xB7,(byte)0x00,(byte)0x08,(byte)0xB1,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0A,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0B,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x0D,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x0E,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x45,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x13,(byte)0xB2,(byte)0x00,(byte)0x0F,(byte)0x12,(byte)0x15,(byte)0xB6,(byte)0x00,(byte)0x17,(byte)0xBB,(byte)0x00,(byte)0x1D,(byte)0x59,(byte)0xB7,(byte)0x00,(byte)0x1F,(byte)0xB6,(byte)0x00,(byte)0x20,(byte)0xB1,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0A,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0E,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x08,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x12,(byte)0x00,(byte)0x08,(byte)0x00,(byte)0x0B,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x13,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x0D,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x23,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x24}; 
     return null; 
     } 

     public static String[] getClassNames() 
     { 
      return new String[] {"a.b.systemmessage","a.b.Startclass"}; 
     } 
} 

Le ClassLoader avec des octets

public class byteClassLoader extends ClassLoader 
{ 
    private Hashtable classes = new Hashtable(); //used to cache already defined classes 
    private byte[] cbytes; 
    public byteClassLoader(byte[] bytes) 
    { 
     super(byteClassLoader.class.getClassLoader()); //calls the parent class loader's constructor 
     this.cbytes = bytes; 
    } 

    public Class loadClass(String className) throws ClassNotFoundException { 
     return findClass(className); 
    } 

    public Class findClass(String className) { 
     byte classByte[]; 
     Class result = null; 

     result = (Class) classes.get(className); //checks in cached classes 
     if (result != null) { 
      return result; 
     } 

     try { 
      return findSystemClass(className); 
     } catch (Exception e) 
     { 
     } 

     try 
     { 
      classByte = cbytes; 
      result = defineClass(className, classByte, 0, classByte.length, null); 
      classes.put(className, result); 
      cbytes = new byte[]{}; 
      return result; 
     }catch(Exception e) 
     { 
      return null; 
     } 
    } 

} 

maintenant ci-dessous est des classes que je veux excute.

La méthode startmethod() est le point de départ.




public class Startclass 
{ 
    public void startmethod() 
    { 
     System.out.println("StartMethod"); 
     new systemmessage().message(); 
    } 
} 

et

public class systemmessage { 

    public void message() 
    { 
     System.out.println("[SYSTEM] Message"); 
    } 
} 

mais voici des exceptions.

StartMethod


Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at a.Loader.load(Loader.java:12)
at a.MainC.main(MainC.java:10)


Caused by: java.lang.ClassFormatError: Truncated class file
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at a.byteClassLoader.findClass(byteClassLoader.java:38)
at a.byteClassLoader.loadClass(byteClassLoader.java:17)
at a.b.Startclass.startmethod(Startclass.java:7)
... 6 more

Merci.

+0

Vous ne voyez pas ce qui ne va pas. Mais si vous essayez d'accéder au code d'octet à l'exécution, utilisez [javaasist] (http://jboss-javassist.github.io/javassist/). – PeterMmm

+0

@PeterMmm merci. Je vais l'essayer. – ponpono

+0

Envisager de remplacer cette structure de code baroque répartie sur quatre classes par une seule classe ou deux avec une méthode faisant directement l'opération voulue. Faire 'getClassNames() [0]' et 'getClassNames() [1]' au lieu de faire référence aux noms en premier lieu, c'est horrible. Créer un nouveau chargeur de classe pour chaque classe n'est pas seulement un gaspillage de ressources, il va se casser si les classes ont des références les unes aux autres. Cela peut être le cas ici, puisque vous remplacez le tableau par un tableau de longueur nulle après la première recherche, ainsi la deuxième recherche provoquera une tentative d'utilisation d'un fichier de classe tronqué ... – Holger

Répondre

0

Un ClassLoader doit être capable de fournir des classes sur demande, par ex. lorsque la JVM tente de résoudre les dépendances de classe, soit en définissant la classe elle-même, soit en déléguant au chargeur de classe qui la définira. Par conséquent, créer un chargeur de classe indépendant pour chaque classe malgré les dépendances doit échouer. Vous aggravez les choses en essayant de définir la classe en utilisant le code d'octet spécifié, quelle que soit la classe réellement demandée. Comme vous définissez le tableau sur un tableau de longueur zéro après la première requête, la seconde tentative échouera avec un "ClassFormatError: fichier de classe tronqué", mais si vous n'avez pas utilisé le tableau de longueur nulle, le message vient de Désadaptation des noms "car le code d'octet est inapproprié pour la classe demandée. D'autre part, l'implémentation d'un chargeur de classe correct est beaucoup plus simple que ce que vous faites. L'implémentation loadClass héritée de java.lang.ClassLoader se préoccupe déjà de la délégation pour trouver des classes du chargeur parent (y compris les classes système) ou pour renvoyer des classes déjà existantes. Vous n'avez qu'à implémenter findClass qui sera invoqué seulement pour les classes inexistantes pour faire un defineClass réel si vous connaissez cette classe.

Ensuite, l'application doit seulement appeler loadClass pour la classe qu'elle veut utiliser, la JVM résoudra les dépendances.

import java.util.HashMap; 
import java.util.Map; 

public class ByteCodeClassLoader extends ClassLoader { 
    final Map<String, byte[]> classes; 

    public ByteCodeClassLoader(Map<String, byte[]> classes) { 
     if(classes == null) throw new NullPointerException(); 
     this.classes = classes; 
    } 

    @Override 
    protected Class<?> findClass(String name) throws ClassNotFoundException { 
     byte[] code = classes.get(name); 
     if(code!=null) return defineClass(name, code, 0, code.length); 
     return super.findClass(name); // will throw ClassNotFoundException 
    } 

    public static void main(String[] args) { 
     Map<String, byte[]> def = new HashMap<>(); 
     def.put("a.b.systemmessage", new byte[] {(byte)0xCA,(byte)0xFE,(byte)0xBA,(byte)0xBE,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x34,(byte)0x00,(byte)0x1F,(byte)0x07,(byte)0x00,(byte)0x02,(byte)0x01,(byte)0x00,(byte)0x11,(byte)0x61,(byte)0x2F,(byte)0x62,(byte)0x2F,(byte)0x73,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x07,(byte)0x00,(byte)0x04,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x4F,(byte)0x62,(byte)0x6A,(byte)0x65,(byte)0x63,(byte)0x74,(byte)0x01,(byte)0x00,(byte)0x06,(byte)0x3C,(byte)0x69,(byte)0x6E,(byte)0x69,(byte)0x74,(byte)0x3E,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x28,(byte)0x29,(byte)0x56,(byte)0x01,(byte)0x00,(byte)0x04,(byte)0x43,(byte)0x6F,(byte)0x64,(byte)0x65,(byte)0x0A,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x09,(byte)0x0C,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x06,(byte)0x01,(byte)0x00,(byte)0x0F,(byte)0x4C,(byte)0x69,(byte)0x6E,(byte)0x65,(byte)0x4E,(byte)0x75,(byte)0x6D,(byte)0x62,(byte)0x65,(byte)0x72,(byte)0x54,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x12,(byte)0x4C,(byte)0x6F,(byte)0x63,(byte)0x61,(byte)0x6C,(byte)0x56,(byte)0x61,(byte)0x72,(byte)0x69,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x54,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x04,(byte)0x74,(byte)0x68,(byte)0x69,(byte)0x73,(byte)0x01,(byte)0x00,(byte)0x13,(byte)0x4C,(byte)0x61,(byte)0x2F,(byte)0x62,(byte)0x2F,(byte)0x73,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x3B,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x09,(byte)0x00,(byte)0x10,(byte)0x00,(byte)0x12,(byte)0x07,(byte)0x00,(byte)0x11,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x53,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x0C,(byte)0x00,(byte)0x13,(byte)0x00,(byte)0x14,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x6F,(byte)0x75,(byte)0x74,(byte)0x01,(byte)0x00,(byte)0x15,(byte)0x4C,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x69,(byte)0x6F,(byte)0x2F,(byte)0x50,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x65,(byte)0x61,(byte)0x6D,(byte)0x3B,(byte)0x08,(byte)0x00,(byte)0x16,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x5B,(byte)0x53,(byte)0x59,(byte)0x53,(byte)0x54,(byte)0x45,(byte)0x4D,(byte)0x5D,(byte)0x20,(byte)0x4D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x0A,(byte)0x00,(byte)0x18,(byte)0x00,(byte)0x1A,(byte)0x07,(byte)0x00,(byte)0x19,(byte)0x01,(byte)0x00,(byte)0x13,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x69,(byte)0x6F,(byte)0x2F,(byte)0x50,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x65,(byte)0x61,(byte)0x6D,(byte)0x0C,(byte)0x00,(byte)0x1B,(byte)0x00,(byte)0x1C,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x70,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x6C,(byte)0x6E,(byte)0x01,(byte)0x00,(byte)0x15,(byte)0x28,(byte)0x4C,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x67,(byte)0x3B,(byte)0x29,(byte)0x56,(byte)0x01,(byte)0x00,(byte)0x0A,(byte)0x53,(byte)0x6F,(byte)0x75,(byte)0x72,(byte)0x63,(byte)0x65,(byte)0x46,(byte)0x69,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x12,(byte)0x73,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x2E,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x00,(byte)0x21,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x2F,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x05,(byte)0x2A,(byte)0xB7,(byte)0x00,(byte)0x08,(byte)0xB1,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0A,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0B,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x0D,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x0E,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x37,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x09,(byte)0xB2,(byte)0x00,(byte)0x0F,(byte)0x12,(byte)0x15,(byte)0xB6,(byte)0x00,(byte)0x17,(byte)0xB1,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0A,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0A,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x08,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x0B,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x09,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x0D,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x1D,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x1E}); 
     def.put("a.b.Startclass", new byte[] {(byte)0xCA,(byte)0xFE,(byte)0xBA,(byte)0xBE,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x34,(byte)0x00,(byte)0x25,(byte)0x07,(byte)0x00,(byte)0x02,(byte)0x01,(byte)0x00,(byte)0x0E,(byte)0x61,(byte)0x2F,(byte)0x62,(byte)0x2F,(byte)0x53,(byte)0x74,(byte)0x61,(byte)0x72,(byte)0x74,(byte)0x63,(byte)0x6C,(byte)0x61,(byte)0x73,(byte)0x73,(byte)0x07,(byte)0x00,(byte)0x04,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x4F,(byte)0x62,(byte)0x6A,(byte)0x65,(byte)0x63,(byte)0x74,(byte)0x01,(byte)0x00,(byte)0x06,(byte)0x3C,(byte)0x69,(byte)0x6E,(byte)0x69,(byte)0x74,(byte)0x3E,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x28,(byte)0x29,(byte)0x56,(byte)0x01,(byte)0x00,(byte)0x04,(byte)0x43,(byte)0x6F,(byte)0x64,(byte)0x65,(byte)0x0A,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x09,(byte)0x0C,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x06,(byte)0x01,(byte)0x00,(byte)0x0F,(byte)0x4C,(byte)0x69,(byte)0x6E,(byte)0x65,(byte)0x4E,(byte)0x75,(byte)0x6D,(byte)0x62,(byte)0x65,(byte)0x72,(byte)0x54,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x12,(byte)0x4C,(byte)0x6F,(byte)0x63,(byte)0x61,(byte)0x6C,(byte)0x56,(byte)0x61,(byte)0x72,(byte)0x69,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x54,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x04,(byte)0x74,(byte)0x68,(byte)0x69,(byte)0x73,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x4C,(byte)0x61,(byte)0x2F,(byte)0x62,(byte)0x2F,(byte)0x53,(byte)0x74,(byte)0x61,(byte)0x72,(byte)0x74,(byte)0x63,(byte)0x6C,(byte)0x61,(byte)0x73,(byte)0x73,(byte)0x3B,(byte)0x01,(byte)0x00,(byte)0x0B,(byte)0x73,(byte)0x74,(byte)0x61,(byte)0x72,(byte)0x74,(byte)0x6D,(byte)0x65,(byte)0x74,(byte)0x68,(byte)0x6F,(byte)0x64,(byte)0x09,(byte)0x00,(byte)0x10,(byte)0x00,(byte)0x12,(byte)0x07,(byte)0x00,(byte)0x11,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x53,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x0C,(byte)0x00,(byte)0x13,(byte)0x00,(byte)0x14,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x6F,(byte)0x75,(byte)0x74,(byte)0x01,(byte)0x00,(byte)0x15,(byte)0x4C,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x69,(byte)0x6F,(byte)0x2F,(byte)0x50,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x65,(byte)0x61,(byte)0x6D,(byte)0x3B,(byte)0x08,(byte)0x00,(byte)0x16,(byte)0x01,(byte)0x00,(byte)0x0B,(byte)0x53,(byte)0x74,(byte)0x61,(byte)0x72,(byte)0x74,(byte)0x4D,(byte)0x65,(byte)0x74,(byte)0x68,(byte)0x6F,(byte)0x64,(byte)0x0A,(byte)0x00,(byte)0x18,(byte)0x00,(byte)0x1A,(byte)0x07,(byte)0x00,(byte)0x19,(byte)0x01,(byte)0x00,(byte)0x13,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x69,(byte)0x6F,(byte)0x2F,(byte)0x50,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x65,(byte)0x61,(byte)0x6D,(byte)0x0C,(byte)0x00,(byte)0x1B,(byte)0x00,(byte)0x1C,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x70,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x74,(byte)0x6C,(byte)0x6E,(byte)0x01,(byte)0x00,(byte)0x15,(byte)0x28,(byte)0x4C,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x2F,(byte)0x6C,(byte)0x61,(byte)0x6E,(byte)0x67,(byte)0x2F,(byte)0x53,(byte)0x74,(byte)0x72,(byte)0x69,(byte)0x6E,(byte)0x67,(byte)0x3B,(byte)0x29,(byte)0x56,(byte)0x07,(byte)0x00,(byte)0x1E,(byte)0x01,(byte)0x00,(byte)0x11,(byte)0x61,(byte)0x2F,(byte)0x62,(byte)0x2F,(byte)0x73,(byte)0x79,(byte)0x73,(byte)0x74,(byte)0x65,(byte)0x6D,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x0A,(byte)0x00,(byte)0x1D,(byte)0x00,(byte)0x09,(byte)0x0A,(byte)0x00,(byte)0x1D,(byte)0x00,(byte)0x21,(byte)0x0C,(byte)0x00,(byte)0x22,(byte)0x00,(byte)0x06,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x6D,(byte)0x65,(byte)0x73,(byte)0x73,(byte)0x61,(byte)0x67,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x0A,(byte)0x53,(byte)0x6F,(byte)0x75,(byte)0x72,(byte)0x63,(byte)0x65,(byte)0x46,(byte)0x69,(byte)0x6C,(byte)0x65,(byte)0x01,(byte)0x00,(byte)0x0F,(byte)0x53,(byte)0x74,(byte)0x61,(byte)0x72,(byte)0x74,(byte)0x63,(byte)0x6C,(byte)0x61,(byte)0x73,(byte)0x73,(byte)0x2E,(byte)0x6A,(byte)0x61,(byte)0x76,(byte)0x61,(byte)0x00,(byte)0x21,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x2F,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x05,(byte)0x2A,(byte)0xB7,(byte)0x00,(byte)0x08,(byte)0xB1,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0A,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0B,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x0D,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x0E,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x45,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x13,(byte)0xB2,(byte)0x00,(byte)0x0F,(byte)0x12,(byte)0x15,(byte)0xB6,(byte)0x00,(byte)0x17,(byte)0xBB,(byte)0x00,(byte)0x1D,(byte)0x59,(byte)0xB7,(byte)0x00,(byte)0x1F,(byte)0xB6,(byte)0x00,(byte)0x20,(byte)0xB1,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x0A,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0E,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x06,(byte)0x00,(byte)0x08,(byte)0x00,(byte)0x07,(byte)0x00,(byte)0x12,(byte)0x00,(byte)0x08,(byte)0x00,(byte)0x0B,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x13,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x0D,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x23,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x24}); 
     ClassLoader cl = new ByteCodeClassLoader(def); 
     try { 
      Class clz = cl.loadClass("a.b.Startclass"); 
      clz.getDeclaredMethod("startmethod").invoke(clz.newInstance()); 
     } catch(ReflectiveOperationException ex) { 
      throw new RuntimeException(ex); 
     } 
    } 
} 

C'est tout.