有时候我们需要根据class文件获取class的内部信息,比如class的完整类名,方法等。注意啊,反射此处貌似行不通,因为只有class文件,不知道类名的。。。
但,我们知道class文件是有规范的,既然有规范,那肯定可以通过规范获取其内部信息。
下面就是class文件结构及class常量池数据数据类型图:
Class文件结构:
Class常量池数据数据类型:
根据Class文件结构及数据类型,我们可以通过以下代码获取类文件内部信息:
/**
* 根据class文件获取该类文件中的类名
*/
@SuppressWarnings("resource")
public static String getFullyQualifiedName(File file) throws IOException {
//class文件
int MAGIC = 0xCAFEBABE;
String name = null;
try {
DataInputStream in = new DataInputStream(new FileInputStream(file));
if(in.readInt() != MAGIC) {
// 不是一个.class文件
throw new IOException("Not a class file");
}
in.readUnsignedShort();// 次版本号
in.readUnsignedShort();// 主版本号
in.readUnsignedShort();// 长度
in.readByte();// CLASS=7
in.readUnsignedShort();// 忽略这个地方
in.readByte();// UTF8=E1
name =in.readUTF();//类的名字!!!
in.close();
} catch(IOException ioe) {
ioe.printStackTrace();
}
return name;
}