天天看点

RTTI 运行时类型信息 与 Reflect 反射1.Class2.获取class与创建对象3.对象转换

rtti,run time type information,运行时类型信息。

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

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

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()

全限定的类名。

java.lang.reflect.constructor<t>

代表类型t的构造函数。

constructor<t> java.lang.class.getdeclaredconstructor(class<?>... parametertypes) 

获得构造函数。

object java.lang.reflect.constructor.newinstance(object... initargs) 

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

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,再干想干的事,多棒啊。

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对象的这个字段的值。

RTTI 运行时类型信息 与 Reflect 反射1.Class2.获取class与创建对象3.对象转换

问:有哪些方法可以获得一个类的class对象呢?

答:有三种,class.forname(‘类的完全限定名’),类名.class,对象.getclass()。

RTTI 运行时类型信息 与 Reflect 反射1.Class2.获取class与创建对象3.对象转换

问:java创建对象的方法有几种?

答:4中。new 一个对象,反序列化一个对象,通过clone()得到对象,通过反射newinstance()创建对象。

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

下一篇: java gui