让我们考虑以下代码:
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");
}
}
}
它有效,我无法理解它是如何工作的。它表明可以获取有关超类参数的信息。我不知道如何获得这样的信息是因为我查看了字节码并且没有这样的信息:
可以吗?
答案 0 :(得分:4)
.class文件中有Signature
个属性,请参阅JVMS §4.7.9。
如果您使用javap -verbose
反编译Main.Inner,您将找到此属性:
Signature: #14 // Lindex/Main$AbstractClass<Lindex/Main$Custom;>;
Class.getGenericSuperclass
实现在native method的帮助下提取此属性,然后解析,验证并将其转换为Java表示。因此,获取此信息绝对可行。