放牧代码和思想
专注自然语言处理、机器学习算法
    This thing called love. Know I would've. Thrown it all away. Wouldn't hesitate.

获取T.class的完整例子

不用再纠结如何获取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)

知识共享许可协议 知识共享署名-非商业性使用-相同方式共享码农场 » 获取T.class的完整例子

评论 3

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

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

    天鉴黑10年前 (2015-02-12)回复

我的作品

HanLP自然语言处理包《自然语言处理入门》