Class的 getSuperclass与getGenericSuperclass区别

一、getSuperclass   返回直接继承的父类(由于编译擦除,没有显示泛型参数

 Class<? super T> getSuperclass() 
          返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class

返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class

如果此 Class 表示 Object 类、一个接口、一个基本类型或 void,则返回 null。

如果此对象表示一个数组类,则返回表示该 Object 类的 Class 对象。 

返回:

此对象所表示的类的超类。

二、getGenericSuperclass  返回直接继承的父类(包含泛型参数

 Type getGenericSuperclass() 
          返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。

返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。

如果超类是参数化类型,则返回的 Type 对象必须准确反映源代码中所使用的实际类型参数。如果以前未曾创建表示超类的参数化类型,则创建这个类型。有关参数化类型创建过程的语义,请参阅 ParameterizedType 声明。

如果此 Class 表示 Object 类、接口、基本类型或 void,则返回 null。

如果此对象表示一个数组类,则返回表示 Object 类的 Class 对象。 

返回:

此对象所表示的类的超类

抛出:

GenericSignatureFormatError - 如果常规类签名不符合 Java Virtual Machine Specification, 3rd edition 规定的格式

TypeNotPresentException - 如果常规超类引用不存在的类型声明

MalformedParameterizedTypeException - 如果常规超类引用的参数化类型由于某种原因无法实例化

代码实例:

package cn.test;

public class Test {

    public static void main(String[] args) {
        System.out.println("Student.class.getSuperclass()\t" 
                            + Student.class.getSuperclass());
        System.out.println("Student.class.getGenericSuperclass()\t"
                            + Student.class.getGenericSuperclass());
        
        System.out.println("Test.class.getSuperclass()\t" 
                            + Test.class.getSuperclass());
        System.out.println("Test.class.getGenericSuperclass()\t"
                            + Test.class.getGenericSuperclass());
       
        System.out.println("Object.class.getGenericSuperclass()\t" 
                            + Object.class.getGenericSuperclass());
        System.out.println("Object.class.getSuperclass()\t" 
                            + Object.class.getSuperclass());
        
        System.out.println("void.class.getSuperclass()\t" 
                            + void.class.getSuperclass());
        System.out.println("void.class.getGenericSuperclass()\t" 
                            + void.class.getGenericSuperclass());
        
        System.out.println("int[].class.getSuperclass()\t" 
                            + int[].class.getSuperclass());
        System.out.println("int[].class.getGenericSuperclass()\t" 
                            + int[].class.getGenericSuperclass());
    }

}

class Person<T> {

}

class Student extends Person<Test> {

}

输出结果:

Student.class.getSuperclass()	class cn.test.Person
Student.class.getGenericSuperclass()	cn.test.Person<cn.test.Test>
Test.class.getSuperclass()	class java.lang.Object
Test.class.getGenericSuperclass()	class java.lang.Object
Object.class.getGenericSuperclass()	null
Object.class.getSuperclass()	null
void.class.getSuperclass()	null
void.class.getGenericSuperclass()	null
int[].class.getSuperclass()	class java.lang.Object
int[].class.getGenericSuperclass()	class java.lang.Object

三、Java中的getGenericSuperclass的基本用法

package cn.tzz.lang.clazz;
 
public class User {
 
    private Integer id;
    private String name;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
     
}

public class BaseHibernateDao<T,ID extends Serializable> {
     
    private Class<T> clazz;
     
    public BaseHibernateDao(){
        //当前对象的直接超类的 Type
        Type genericSuperclass = getClass().getGenericSuperclass();
        if(genericSuperclass instanceof ParameterizedType){
            //参数化类型  //ParameterizedType参数化类型,即泛型
            ParameterizedType parameterizedType= (ParameterizedType) genericSuperclass;
            //返回表示此类型实际类型参数的 Type 对象的数组
            Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
            this.clazz= (Class<T>)actualTypeArguments[0];
        }else{
            this.clazz= (Class<T>)genericSuperclass;
        }
    }
 
    public Class<T> getClazz() {
        return clazz;
    }
}


public class UserService extends BaseHibernateDao<User, Integer>{
 
}

测试实例:

public class TestUserService {
    public static void main(String[] args) {
        UserService userService = new UserService();
        System.out.println(userService.getClass());
    }
}

运行结果:

class cn.tzz.lang.clazz.User

本文:参考:

https://www.cnblogs.com/nihaorz/p/7595117.html

https://www.cnblogs.com/maokun/p/6773203.html

发布了29 篇原创文章 · 获赞 49 · 访问量 6614

猜你喜欢

转载自blog.csdn.net/wangsen927/article/details/90732684
今日推荐