不用再纠结如何获取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<String> foo = new Foo<String>()
{
};
// 在类的外部这样获取
Type type = ((ParameterizedType)foo.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
System.out.println(type);
// 在类的内部这样获取
System.out.println(foo.getTClass());
}
}
abstract class Foo<T>
{
public Class<T> getTClass()
{
Class<T> tClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
return tClass;
}
}
输出:
class java.lang.String class java.lang.String
关于getGenericSuperclass等等的解释,请参考http://blog.csdn.net/gengv/article/details/5178055
我想补充的是,这里利用继承+反射来达到目的,反射的用法在上面的链接里讲得很清楚,不明白的话慢慢谷歌。继承是必须的,最重要的是必须有一个非泛型(我不知道这么讲准不准确,我的意思是类似于class <String>这样的非泛型,而不是class <T>这样的泛型)的类实例化才能达到目的,比如在上面的例子中就是这个匿名类:
Foo<String>()
{
};
不信的话你试试泛型继承:
package com.hankcs;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class Main
{
public static void main(String[] args)
{
Foo<String> foo = new Child<String>();
// 在类的外部这样获取
Type type = ((ParameterizedType)foo.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
System.out.println(type);
// 在类的内部这样获取
System.out.println(foo.getTClass());
}
}
abstract class Foo<T>
{
public Class<T> getTClass()
{
Class<T> tClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
return tClass;
}
}
class Child<T> 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)

码农场
field.getgenerictype()完美解决问题。