import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class Main {
public static void main(String[] args) throws NoSuchMethodException {
new Sub();
}
}
class Parent {
}
class Child extends Parent {
}
class UpperGeneric {
static class Generic<T, R> {
T t;
R r;
protected Generic(T t, R r) {
this.t = t;
this.r = r;
}
void foo() {
System.err.println(t + " " + r);
}
}
}
class Sub extends UpperGeneric.Generic<Child, Integer> {
private UpperGeneric.Generic<Child, Integer> getFz(){
return null;
}
protected Sub() {
super(new Child(), 1);
Class clazz = getClass().getSuperclass();
System.err.println("super clazz:" + clazz);
Type type = getClass().getGenericSuperclass();
System.err.println("generic super class type:" + type);
// getActualTypeArguments:获取泛型类的参数类型
Type trueType = ((ParameterizedType) type).getActualTypeArguments()[0];
System.err.println("generic super class type:" + trueType);
trueType = ((ParameterizedType) type).getActualTypeArguments()[1];
System.err.println("type:" + trueType);
trueType = ((ParameterizedType) type).getRawType();
System.err.println("raw type:" + trueType);
// getOwnerType:获取一个type的包装类。如果type不是任何类的内部类,返回null,否则返回外部类的Type
// 这里type是指UpperGeneric$Generic<Child, java.lang.Integer>内部类
trueType = ((ParameterizedType) type).getOwnerType();
System.err.println("owner type:" + trueType);
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
Method[] methods = Sub.class.getDeclaredMethods();
for(Method method : methods){
if("getFz".equals(method.getName())){
System.out.println("method.getGenericReturnType() = " + method.getGenericReturnType());
System.out.println("method.getReturnType() = " + method.getReturnType());
System.out.println(method.getGenericReturnType() instanceof ParameterizedType);
Type actualArgType0 = ((ParameterizedType) method.getGenericReturnType()).getActualTypeArguments()[0];
System.out.println(actualArgType0);
Type actualArgType1 = ((ParameterizedType) method.getGenericReturnType()).getActualTypeArguments()[1];
System.out.println(actualArgType1);
}
}
}
}
不常用java知识
最新推荐文章于 2024-07-22 14:15:06 发布