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对象的这个字段的值。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5SZslWbz9CX0xWdhZWZk9CX09Wbl9lcvRXakVGa49CXy9GdpRWZoh3LcRXZu5ibkN3Yuc2bsJmLjlGdhR3cvw1LcpDc0RHaiojIsJye.gif)
问:有哪些方法可以获得一个类的class对象呢?
答:有三种,class.forname(‘类的完全限定名’),类名.class,对象.getclass()。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5SZslWbz9CX0xWdhZWZk9CX09Wbl9lcvRXakVGa49CXy9GdpRWZoh3LcRXZu5ibkN3Yuc2bsJmLjlGdhR3cvw1LcpDc0RHaiojIsJye.gif)
问:java创建对象的方法有几种?
答:4中。new 一个对象,反序列化一个对象,通过clone()得到对象,通过反射newinstance()创建对象。
两个类a与b,字段完全一致,现有 a的对象a,如何快速构造一个b类的b对象?