不用再纠结如何获取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()完美解决问题。