Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用javassist获取常量池表_Java_Javassist - Fatal编程技术网

如何使用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.

如何使用javassist从类文件中获取常量池表

我已经在这里编写了代码:

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