Si vous avez besoin juste le nom de la classe, il est probablement plus facile d'analyser le début de la classe fichier vous-même au lieu d'ajouter une bibliothèque 3ème partie pour la manipulation de code de classe juste à cet effet. Vous avez juste besoin des classes et des chaînes du pool constant, passez les drapeaux d'accès et remplacez/par. dans le nom de la classe. Si vous avez un tableau d'octets, vous pouvez appeler cette méthode avec new ByteArrayInputStream(byteArray)
:
public static String getClassName(InputStream is) throws Exception {
DataInputStream dis = new DataInputStream(is);
dis.readLong(); // skip header and class version
int cpcnt = (dis.readShort()&0xffff)-1;
int[] classes = new int[cpcnt];
String[] strings = new String[cpcnt];
for(int i=0; i<cpcnt; i++) {
int t = dis.read();
if(t==7) classes[i] = dis.readShort()&0xffff;
else if(t==1) strings[i] = dis.readUTF();
else if(t==5 || t==6) { dis.readLong(); i++; }
else if(t==8) dis.readShort();
else dis.readInt();
}
dis.readShort(); // skip access flags
return strings[classes[(dis.readShort()&0xffff)-1]-1].replace('/', '.');
}
Eh bien, devinez quoi la JVM elle-même fait? Correct, il interprète le bytecode et obtient le nom de la classe :) Sans donner un peu plus de détails sur quoi, comment et (principalement) pourquoi vous essayez de le faire donner une réponse est difficile – sfussenegger
Ouais, ouais, noté .. Je voudrais obtenir le nom de la classe à l'exécution afin que je puisse charger dynamiquement la classe avec un classloader, puisque vous devez spécifier le nom et le classpath de la classe que vous chargez. – JHollanti