java - Java 中的 getGenericSuperclass()。它是如何工作的?

标签 java reflection jvm

让我们考虑以下代码:

package index;

public class Main {
    public static void main(String[] args) {
        Inner inner = new Inner();
        Type t = inner.getClass().getGenericSuperclass();
        ParameterizedType p = (ParameterizedType) t;
        Type[] a = p.getActualTypeArguments();
        try {
            Custom c = (Custom) ((Class) a[0]).newInstance();
            c.f();
        } catch (Exception e){}
    }

    private static abstract class AbstractClass<T> {
        public abstract void doSth();
    }
    private static class Inner extends AbstractClass<Custom>{
        public void doSth() {
        }
    }
    private static class Custom{
        public Custom(){

        }
        public void f(){
            System.out.println("Custom");
        }
    }
}
  1. 它可以工作,但我不明白它是如何工作的。它表明可以获取有关父类(super class)参数的信息。我不知道怎么可能得到这样的信息,因为我查看了字节码并没有这样的信息:

  2. 这样做可以吗?

最佳答案

.class 文件中有一个Signature 属性,参见JVMS §4.7.9 .

如果你用 javap -verbose 反编译 Main.Inner,你会发现这个属性:

Signature: #14    // Lindex/Main$AbstractClass<Lindex/Main$Custom;>;

Class.getGenericSuperclass实现在 native method 的帮助下提取此属性然后解析、验证并将其转换为 Java 表示。所以,获取这些信息是绝对可能的,也是可以的。

关于java - Java 中的 getGenericSuperclass()。它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42874197/

相关文章:

java - 使用反射使用父类(super class)获取子类字段?

java - Java虚拟机的启动时间由什么组成?

delegates - 为什么 kotlin 不允许协变 mutablemap 成为委托(delegate)?

java - pom.xml 文件中的不同目标

java - 在 Rust 项目的 C 绑定(bind)上运行 jextract 时, fatal error "' stdlib.h' file not found

java - 我怎样才能得到 HttpResponseException 背后的实际错误?

java - 为什么谓词在某些编译器中似乎没有按预期编译?

c# - 我如何知道 propertyInfo 是否属于 C# 中的 IList 类型?

c# - 如何找到未执行的代码

Java终于回归了,奇怪的字节码