java泛型,RTTI与反射区别

泛型与反射拿到的类型区别

除了int等基本类型外,Java的其他类型全部都是class(包括interface)注意是小写的
而大写的Class本质上也是一种小写的class。说到这里不得不提到jvm。

public final class Class {
    private Class() {}
}

class是由JVM在执行过程中动态加载的。JVM在第一次读取到一种class类型时,将其加载进内存。每加载一种class,JVM就为其创建一个Class类型的实例,并关联起来。
这个Class实例是JVM内部创建的,如果我们查看JDK源码,可以发现Class类的构造方法是private,只有JVM能创建Class实例,我们自己的Java程序是无法创建Class实例的。
所以,JVM持有的每个Class实例都指向一个实际的数据类型(class或interface)
注意,JVM为每一种基本类型如int也创建了Class实例,通过int.class访问。:
file
一个Class实例包含了该class的所有完整信息:
file
由于JVM为每个加载的class创建了对应的Class实例,并在实例中保存了该class的所有信息,包括类名、包名、父类、实现的接口、所有方法、字段等,因此,如果获取了某个Class实例,我们就可以通过这个Class实例获取到该实例对应的class的所有信息。
这种通过Class实例获取class信息的方法称为反射(Reflection)

说到这里,T与Class的区别就显而易见了,T是具体的类,而Class则是jvm对类的一种封装
Class Class Class<?>
MYClass MYClass<?> MYClass.class

如下代码是根据字符串,来动态查找的例子

    public R searchone(@RequestBody SearchPara para) {
        Object raw_result;//查询返回的结果,是JavaList
        Class<?> Type;//类型,用反射,把字符串转为对应的类
        //查询
        raw_result = esOperator.search_all(Type, para.getId(), para.getBeginTime(), para.getEndTime(), para.getMaxSize());
    }

    public <T> Object search_all(Class<T> type, int id, Date beginTime, Date endTime, int maxSize) {
        //执行查询,demo为索引表,_search为检索操作action
        ESDatas<T> esDatas =
 client_search.searchList(type.getField("index_name").get(type).toString() + "/_search",//demo为索引表,_search为检索操作action
                        "searchDatas",//esmapper/.xml中定义的dsl语句
                        params,//变量参数
                        type);//返回的文档封装对象类型
        //获取结果对象列表
        List<T> results = esDatas.getDatas();
        return results;
    }

实际上,无需使用泛型,只需将T改成?即可

Class<?> Type = Class.forName("com.water.modules.business.entity." + groupParm.getType());//获取类
Field f1 = Type.getDeclaredField("属性名");//获取属性
f1.setAccessible(true);//获取私有属性需要加这个
String value = (String) f1.get(o);//取值

RTTI

c++
RTTI(Run-Time Type Identification)运行时类型识别(实际上是编译时),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型

template <typename _Tx, typename _Ty>
auto multiply(_Tx x, _Ty y)->decltype(x*y)
{
    return x*y;
}

RTTI与反射

RTTI:编译器在编译期间打开和检查.class文件
而反射是:编译器在运行期间打开和检查.class文件

参考资料

https://blog.csdn.net/qq_31788759/article/details/107285091
https://www.liaoxuefeng.com/wiki/1252599548343744/1264799402020448