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对象?


目录
相关文章
|
Java
Java Reflection机制 实现类的反射与动态调用
Java Reflection机制被广泛用于实现类的反射和动态调用,反射是指在运行时检查和操作类的能力。只需要一个类的名称或对象的引用,就可以获取类的信息,调用类的方法,创建对象实例等。
87 0
|
Java
在Java中,接口、抽象类、静态类以及非静态类有着各自的特点和用途
在Java中,接口、抽象类、静态类以及非静态类有着各自的特点和用途
96 1
|
10月前
|
Java 编译器
详解Java中的重写和重载 | 动态绑定和静态绑定
详解Java中的重写和重载 | 动态绑定和静态绑定
227 0
|
Java 关系型数据库 MySQL
C#反射(Reflection)详解及于java反射的对比
C#反射(Reflection)详解及于java反射的对比
|
Java
Java 反射之调用运行时类中指定的属性
Java 反射之调用运行时类中指定的属性
73 0
|
XML 并行计算 安全
【Java】反射, 枚举,Lambda表达式
【Java】反射, 枚举,Lambda表达式
165 0
【Java】反射, 枚举,Lambda表达式
|
Java
Java - 子类隐藏成员变量和方法重写的理解
Java - 子类隐藏成员变量和方法重写的理解
252 0
Java - 子类隐藏成员变量和方法重写的理解
|
Java
Java - 向上转型和动态绑定机制
Java - 向上转型和动态绑定机制
92 0
Java - 向上转型和动态绑定机制
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 通过 MetaClass#invokeMethod 方法调用类其它方法 )
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 通过 MetaClass#invokeMethod 方法调用类其它方法 )
178 0
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 通过 MetaClass#invokeMethod 方法调用类其它方法 )
|
Java Android开发
【Groovy】Groovy 方法调用 ( Java 中函数参数是接口类型 | 函数参数是接口类型 可以 直接传递闭包 )
【Groovy】Groovy 方法调用 ( Java 中函数参数是接口类型 | 函数参数是接口类型 可以 直接传递闭包 )
329 0
【Groovy】Groovy 方法调用 ( Java 中函数参数是接口类型 | 函数参数是接口类型 可以 直接传递闭包 )