获取 CtClass 超类名称或 CtClass 超类实例

Obtaining CtClass superclass name or CtClass superclass instance

我正在编写自定义 class 加载程序,它会扫描 .jar 文件中的所有 classes。我想根据它们扩展的当前超级 class 对某些 classes 进行一些更改。然而,问题在于某些超级 classes 可能尚未被此 class 加载程序加载或在 ClassPool 中可用。有什么方法可以获得 superclass 名称(字符串值对我来说足够了)?

private Class<?> find(String name) throws Exception {
    // pre-scanned class entries
    // private final Map<String, JarEntry> classByName;
    JarEntry classEntry = classByName.get(name);

    if (classEntry == null) {
        throw new ClassNotFoundException("Unable to find class: " + name);
    }

    try (JarFile file = new JarFile(filePath)) {
        try (DataInputStream classInputStream = new DataInputStream(file.getInputStream(classEntry))) {
            ClassFile classFile = new ClassFile(classInputStream);
            CtClass clazz = pool.makeClass(classFile);

            // this will throw exception if the super class is not yet available
            if (clazz.getSuperclass().getName().equals("java.lang.Thread")) {
                // make some changes
            }

            return clazz.toClass(this, null);
        }
    }
}
Caused by: javassist.NotFoundException: i
at javassist.ClassPool.get(ClassPool.java:422)
at javassist.CtClassType.getSuperclass(CtClassType.java:816)

ClassFile 常量池包含所有class 名称,但我不知道如何确定哪个是超级class。我是否必须事先将所有 classes 放入 ClassPool?

Javassist 版本为 3.25.0-GA

我不确定 Javassist 的 API 是什么样子,但在字节码级别,class 文件结构中有一个 super 字段,它是常量池的索引.所以你只需要读取该字段并查看常量池中相应的 class 条目即可获得 superclass 名称。