如何使用javassist获取常量池表
如何使用javassist从类文件中获取常量池表 我已经在这里编写了代码:如何使用javassist获取常量池表,java,javassist,Java,Javassist,如何使用javassist从类文件中获取常量池表 我已经在这里编写了代码: ClassPool pool = ClassPool.getDefault(); pool.insertClassPath(filepath); CtClass cc = pool.get(filename); 现在,请告诉我进一步的步骤。一旦您拥有了CtClass,您只需要访问classFile对象来检索常量池,如下所示: ClassPool pool = ClassPool.getDefault(); pool.
ClassPool pool = ClassPool.getDefault();
pool.insertClassPath(filepath);
CtClass cc = pool.get(filename);
现在,请告诉我进一步的步骤。一旦您拥有了CtClass,您只需要访问classFile对象来检索常量池,如下所示:
ClassPool pool = ClassPool.getDefault();
pool.insertClassPath(filepath);
CtClass cc = pool.get(filename);
ConstPool classConstantPool = cc.getClassFile().getConstPool()
如果有人在这里绊倒了,可以用一种更有效的方式(不使用
ClassPool
)完成:
如果性能非常重要,可以对其进行优化,以便仅从文件中读取常量池:
try (InputStream inputStream = Files.newInputStream(Paths.get(filepath))) {
return readConstantPool(new DataInputStream(inputStream));
}
其中:
// copied from ClassFile#read(DataInputStream)
private static ConstPool readConstantPool(@NonNull DataInputStream in) throws IOException {
int magic = in.readInt();
if (magic != 0xCAFEBABE) {
throw new IOException("bad magic number: " + Integer.toHexString(magic));
}
int minor = in.readUnsignedShort();
int major = in.readUnsignedShort();
return new ConstPool(in);
}
// copied from ClassFile#read(DataInputStream)
private static ConstPool readConstantPool(@NonNull DataInputStream in) throws IOException {
int magic = in.readInt();
if (magic != 0xCAFEBABE) {
throw new IOException("bad magic number: " + Integer.toHexString(magic));
}
int minor = in.readUnsignedShort();
int major = in.readUnsignedShort();
return new ConstPool(in);
}