获取T.class的完整例子

来源:互联网 发布:算法伪代码怎么写 编辑:程序博客网 时间:2024/05/17 15:41

不用再纠结如何获取T.class了,我整理了一段完整的示例:

  1. package com.hankcs;
  2.  
  3. import java.lang.reflect.ParameterizedType;
  4. import java.lang.reflect.Type;
  5.  
  6. public class Main
  7. {
  8.  
  9.     public static void main(String[] args)
  10.     {
  11.         Foo<String> foo = new Foo<String>()
  12.         {
  13.         };
  14.         // 在类的外部这样获取
  15.         Type type = ((ParameterizedType)foo.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
  16.         System.out.println(type);
  17.         // 在类的内部这样获取
  18.         System.out.println(foo.getTClass());
  19.     }
  20. }
  21.  
  22. abstract class Foo<T>
  23. {
  24.     public Class<T> getTClass()
  25.     {
  26.         Class<T> tClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
  27.         return tClass;
  28.     }
  29. }

输出:

  1. class java.lang.String
  2. class java.lang.String

关于getGenericSuperclass等等的解释,请参考http://blog.csdn.net/gengv/article/details/5178055

我想补充的是,这里利用继承+反射来达到目的,反射的用法在上面的链接里讲得很清楚,不明白的话慢慢谷歌。继承是必须的,最重要的是必须有一个非泛型(我不知道这么讲准不准确,我的意思是类似于class <String>这样的非泛型,而不是class <T>这样的泛型)的类实例化才能达到目的,比如在上面的例子中就是这个匿名类:

  1.  Foo<String>()
  2.         {
  3.         };

不信的话你试试泛型继承:

  1. package com.hankcs;
  2.  
  3. import java.lang.reflect.ParameterizedType;
  4. import java.lang.reflect.Type;
  5.  
  6. public class Main
  7. {
  8.  
  9.     public static void main(String[] args)
  10.     {
  11.         Foo<String> foo = new Child<String>();
  12.         // 在类的外部这样获取
  13.         Type type = ((ParameterizedType)foo.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
  14.         System.out.println(type);
  15.         // 在类的内部这样获取
  16.         System.out.println(foo.getTClass());
  17.     }
  18. }
  19.  
  20. abstract class Foo<T>
  21. {
  22.     public Class<T> getTClass()
  23.     {
  24.         Class<T> tClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
  25.         return tClass;
  26.     }
  27. }
  28.  
  29. class Child<T> extends Foo
  30. {
  31.  
  32. }

输出:

  1. Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
  2. at com.hankcs.Main.main(Main.java:13)
  3. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  4. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  5. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  6. at java.lang.reflect.Method.invoke(Method.java:606)
  7. at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

原创粉丝点击