天天看點

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