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

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与创建对象

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

3.对象转换

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


上一篇:RDS SQL Server死锁(Deadlock)系列之五利用Extended Events获取死锁信息


下一篇:万字篇!Linux从基础到实战完整版,斩获字节跳动offer,薪资上涨168%!