abstract class TestGeneric1 <T extends java.util.List> {
public String getClassName() {
Class clazz = (Class) ((java.lang.reflect.ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
return clazz.getName();
}
public static void main(String[] args) {
class TestX extends TestGeneric1 <java.util.ArrayList>{
};
TestX test = new TestX();
System.out.println(test.getClassName()); //output java.util.ArrayList
}
}
abstract class TestGeneric2<T> {
public String getClassName() {
String genericSuperclass = queryGenericSuperclass(getClass()).getGenericSuperclass().toString();
return genericSuperclass.substring(TestGeneric2.class.getName().length() + 1, genericSuperclass.length() - 1);
}
private Class queryGenericSuperclass(Class clazz) {
if (clazz.getGenericSuperclass().toString().startsWith(TestGeneric2.class.getName())) {
return clazz;
} else {
return queryGenericSuperclass(clazz.getSuperclass());
}
}
public static void main(String[] args) throws Exception {
class TestX extends TestGeneric2<String> {
}
TestGeneric2 test = new TestX();
System.out.println(test.getClassName()); //output java.lang.String;
}
}