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)
它有效,我无法理解它是如何工作的。它表明可以获取有关超类参数的信息。我不知道如何获得这样的信息,因为我查看了字节码并且没有这样的信息:
可以吗?
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 表示。所以,获取这些信息是绝对可能的。