Java 得到泛型中得到T.class

Class <T> entityClass = (Class <T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 

 

getGenericInterfaces()和getGenericSuperclass()

 getInterfaces()和getSuperclass()

先来看看这两个方法都是干什么用的:

 

1. public Type getGenericSuperclass()

用来返回表示当前Class 所表示的实体(类、接口、基本类型或 void)的直接超类的Type。如果这个直接超类是参数化类型的,则返回的Type对象必须明确反映在源代码中声明时使用的类型。比如:

   

import java.lang.reflect.ParameterizedType;  
public class GT1 extends GT2<Integer>{  
    public static void main(String[] args) {  
        System.out.println(((ParameterizedType)new GT1().getClass().getGenericSuperclass()));  
    }  
}  

则输出结果即为:

GT2<java.lang.Integer>

 

    如果此Class代表的是Object 类、接口、基本类型或 void,则返回 null。。如果此对象表示一个数组类,则返回表示 Object 类的 Class 对象。

 

2. public Type[] getGenericInterfaces()

    与上面那个方法类似,只不过Java的类可以实现多个接口,所以返回的Type必须用数组来存储

    以上两个方法返回的都是Type对象或数组,在我们的这个话题中,Class都是代表的参数化类型,因此可以将Type对象Cast成ParameterizedType对象。而 ParameterizedType对象有一个方法, getActualTypeArguments()。

public Type[] getActualTypeArguments()

用来返回一个Type对象数组,这个数组代表着这个Type声明中实际使用的类型。接着使用上面的例子:

 

import java.lang.reflect.ParameterizedType;  
public class GT1 extends GT2<Integer>{  
    public static void main(String[] args) {  
    System.out.println(((ParameterizedType)new GT1().getClass().getGenericSuperclass()).getActualTypeArguments()[0]);  
    }  
}  

这次的显示结果将是:class java.lang.Integer

      因此,我们可以通过继承+反射的方法,来的到T.class

     需要说明的是,江南白衣使用的方法是将关键语句

     Class < T >  entityClass  =  (Class < T > ) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[ 0 ];

      放在了超类,也就是声明泛型的那个类的构造方法中。这样一来,子类在继承具有泛型的超类时,会自动调用超类的构造方法。在此超类的构造方法中,调用的getClass返回的是子类的Class类型(与通常的重写机制有悖,呵呵,有待深究,但测试结果确是如此),则在子类中就无需再显式地使用getGenericInterfaces()和getGenericSuperclass()等方法了。

     接着,再使用(Class<T>)对 getActualTypeArguments()返回的元素做casting,即可得到所谓的T.class

原文地址http://blog.youkuaiyun.com/gengv/article/details/5178055

转载于:https://www.cnblogs.com/onlysun/p/4539472.html

Java中,使用的方法可以通过参数来传入。如果您希望获取一个类的对象(例如一个类或接口的Class对象),可以使用通配符类参数来达到这个目的。具体步骤如下: 1. 创建一个带有参数的方法,并在方法内部声明一个变量作为类参数的类,例如使用类参数T来代替实际的。 ```java public static <T> Class<T> getClass(T obj) { return obj.getClass(); } ``` 在这个方法中,我们将一个对象obj作为方法的参数,并将其转换为Class对象。 2. 在调用该方法时,您需要传递一个具有实际的对象作为参数。例如,如果您有一个集合List<String>,您可以调用该方法并传入一个String对象作为参数。 ```java List<String> list = new ArrayList<>(); Class<String> stringClass = getClass(list.get(0)); ``` 在这个例子中,我们获取了列表中的第一个元素(类为String),并将其传递给方法以获取其Class对象。 另外,需要注意的是,由于通配符类参数是在编译时使用的,因此如果您传递了一个没有在代码中明确指定的的对象给方法,那么该方法可能会编译失败或返回错误的Class对象。因此,在调用该方法时需要确保传递的对象是正确的。 如果您想要获取一个对象的Class对象并且不关心它的具体类,那么可以使用通配符类参数并直接返回该对象的Class对象。例如: ```java public static Class<?> getClass(Object obj) { return obj.getClass(); } ``` 在这个例子中,我们使用了Type变量的别名而不是类参数T。请注意,这个方法可能会返回任何对象的Class对象,而不仅仅是对象的Class对象。如果您只关心Class对象,那么最好使用上面的示例中的示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值