RTTI 运行时类型信息 与 Reflect 反射

简介: RTTI,Run Time Type Information,运行时类型信息。 要理解RTTI在java中的工作原理,必须知道 类型信息 在 运行时 是如何表示的。每个类都有一个字段“Class class;”,好晕啊,类名和对象名一样。 每当编写并编译了一个新类,就会产生一个Class对象,被保存在同名的.class文件中。JVM的类加载器会去用它。 1.Class public

RTTI,Run Time Type Information,运行时类型信息。

要理解RTTI在java中的工作原理,必须知道 类型信息 在 运行时 是如何表示的。每个类都有一个字段“Class class;”,好晕啊,类名和对象名一样

每当编写并编译了一个新类,就会产生一个Class对象,被保存在同名的.class文件中。JVM的类加载器会去用它。

1.Class

public final class Class<T> implements java.io.Serializable, GenericDeclaration,Type,AnnotatedElement{}

这是Class类的定义。

Class<?> java.lang.Class.forName(String className)

这个静态方法可以取得Class对象的引用,参数必须为完全限定名。

String java.lang.Class. getSimpleName()
不含包名的类名。
String java.lang.Class. getName()

全限定的类名。

1.1 构造函数

java.lang.reflect.Constructor<T>

代表类型T的构造函数。

Constructor<T> java.lang.Class.getDeclaredConstructor(Class<?>... parameterTypes) 

获得构造函数。

Object java.lang.reflect.Constructor.newInstance(Object... initargs) 

通过构造函数获得新对象。

1.2函数

java.lang.reflect.Method

表示类或接口的一个方法。
Method java.lang.Class. getMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException
得到当前类的指定方法。
Object java.lang.reflect.Method. invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException

在对象obj上调用这个方法。

void java.lang.reflect.AccessibleObject.setAccessible(boolean flag)

Field与Method类都继承了AccessibleObject。所以可以使用这个方法将访问权限从private改为public,再干想干的事,多棒啊。

1.3字段

java.lang.reflect.Field

表示类或接口的一个字段。

Field[] java.lang.Class.getFields()

返回所有public权限的字段。

Field java.lang.Class.getField(String name)
返回名为name的Field对象,只对public权限的字段有效。

Field[] java.lang.Class.getDeclaredFields()

返回所有声明的字段,即便private权限也有效。

Field java.lang.Class.getDeclaredField(String name) 

返回名为name的Field对象,即便private权限也有效。
double java.lang.reflect.Field.getDouble(Object obj) 
一批类似方法有getDouble\getInt\getLong等。返回obj对象的这个字段的值。
Object java.lang.reflect.Field.get(Object obj)
对于非基本类型,返回obj对象的这个字段的值。

2.获取class与创建对象

微笑问:有哪些方法可以获得一个类的Class对象呢?
答:有三种,class.forName(‘类的完全限定名’),类名.class,对象.getClass()。
微笑问:java创建对象的方法有几种?
答:4中。new 一个对象,反序列化一个对象,通过clone()得到对象,通过反射newInstance()创建对象。

3.对象转换

两个类A与B,字段完全一致,现有 A的对象a,如何快速构造一个B类的b对象?


目录
相关文章
|
4月前
|
存储 安全 编译器
【C++ 多态 】深入理解C++的运行时类型信息(RTTI):dynamic_cast和typeid的应用与原理
【C++ 多态 】深入理解C++的运行时类型信息(RTTI):dynamic_cast和typeid的应用与原理
326 1
|
Java
Java Reflection机制 实现类的反射与动态调用
Java Reflection机制被广泛用于实现类的反射和动态调用,反射是指在运行时检查和操作类的能力。只需要一个类的名称或对象的引用,就可以获取类的信息,调用类的方法,创建对象实例等。
52 0
|
4月前
|
安全 Java API
Java中的反射(通过反射获取类的结构、invoke方法、获取注解)
Java中的反射(通过反射获取类的结构、invoke方法、获取注解)
|
JavaScript 前端开发 API
ES6 拾遗:理解 Reflect 反射对象
理解 Reflect 反射对象
98 0
ES6 拾遗:理解 Reflect 反射对象
|
Java
Java 反射之调用运行时类中指定的属性
Java 反射之调用运行时类中指定的属性
39 0
|
IDE 安全 Java
Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法?
Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法?
255 0
Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法?
|
数据挖掘 Go 索引
go语言反射机制、reflect.TypeOf、 reflect.ValueOf、字符串处理(详解)
go语言反射机制、reflect.TypeOf、 reflect.ValueOf、字符串处理(详解)
289 0
|
Java Android开发
【Groovy】Groovy 方法调用 ( Java 中函数参数是接口类型 | 函数参数是接口类型 可以 直接传递闭包 )
【Groovy】Groovy 方法调用 ( Java 中函数参数是接口类型 | 函数参数是接口类型 可以 直接传递闭包 )
294 0
【Groovy】Groovy 方法调用 ( Java 中函数参数是接口类型 | 函数参数是接口类型 可以 直接传递闭包 )