获取T.class的完整例子
来源:互联网 发布:算法伪代码怎么写 编辑:程序博客网 时间:2024/05/17 15:41
不用再纠结如何获取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)