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

Gil*_*esz 2 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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 它有效,我无法理解它是如何工作的。它表明可以获取有关超类参数的信息。我不知道如何获得这样的信息,因为我查看了字节码并且没有这样的信息:

  2. 可以吗?

apa*_*gin 5

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

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

Signature: #14    // Lindex/Main$AbstractClass<Lindex/Main$Custom;>;
Run Code Online (Sandbox Code Playgroud)

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