微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决获取 CtClass 超类名称或 CtClass 超类实例

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

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 常量池包含所有类名,但我不知道如何确定哪个是超类。我是否必须事先将所有类都放到 Classpool 中?

Javassist 版本为 3.25.0-GA

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。