不用再纠结如何获取T.class了,我整理了一段完整的示例:
package com.hankcs;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class Main
{
public static void main(String[] args)
{
Foo foo = new Foo()
{
};
// 在类的外部这样获取
Type type = ((ParameterizedType)foo.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
System.out.println(type);
// 在类的内部这样获取
System.out.println(foo.getTClass());
}
}
abstract class Foo
{
public Class getTClass()
{
Class tClass = (Class)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
return tClass;
}
}
输出:
class java.lang.String
class java.lang.String
我想补充的是,这里利用继承+反射来达到目的,反射的用法在上面的链接里讲得很清楚,不明白的话慢慢谷歌。继承是必须的,最重要的是必须有一个非泛型(我不知道这么讲准不准确,我的意思是类似于class 这样的非泛型,而不是class 这样的泛型)的类实例化才能达到目的,比如在上面的例子中就是这个匿名类:
Foo()
{
};
不信的话你试试泛型继承:
package com.hankcs;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class Main
{
public static void main(String[] args)
{
Foo foo = new Child();
// 在类的外部这样获取
Type type = ((ParameterizedType)foo.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
System.out.println(type);
// 在类的内部这样获取
System.out.println(foo.getTClass());
}
}
abstract class Foo
{
public Class getTClass()
{
Class tClass = (Class)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
return tClass;
}
}
class Child extends Foo
{
}
输出:
Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
at com.hankcs.Main.main(Main.java:13)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)