java t.class_获取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 foo = new Foo()

{

};

// 在类的外部这样获取

Type type = ((ParameterizedType)foo.getClass().getGenericSuperclass()).getActualTypeArguments()[0];

System.out.println(type);

// 在类的内部这样获取

System.out.println(foo.getTClass());

}

}

abstract class Foo

{

public Class getTClass()

{

Class tClass = (Class)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];

return tClass;

}

}

输出:

class java.lang.String

class java.lang.String

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

Foo()

{

};

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

package com.hankcs;

import java.lang.reflect.ParameterizedType;

import java.lang.reflect.Type;

public class Main

{

public static void main(String[] args)

{

Foo foo = new Child();

// 在类的外部这样获取

Type type = ((ParameterizedType)foo.getClass().getGenericSuperclass()).getActualTypeArguments()[0];

System.out.println(type);

// 在类的内部这样获取

System.out.println(foo.getTClass());

}

}

abstract class Foo

{

public Class getTClass()

{

Class tClass = (Class)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];

return tClass;

}

}

class Child 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)

9a0a809c70542281c0930c4c40dfb9be.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值