2014年5月7日 星期三

Java with RTTI

一般而言,我們希望程式執行時每個使用的class的型態能夠確定,但並不是每個class在compile期間就清楚其型態,因此在這Java注重繼承、多型的語言,RTTI顯然占了一席之地

RTTI(Runtime Type Information) : 讓我們在程式運行時,可以發現並確認型態

RTTI有兩種方式
1.傳統的RTTI : 假設所有class在編譯時就已確定型態,而他需要使用.class文件,有三種方式
     a) Upcasting & Downcasting (Downcasting在Java中需要強制轉換)
     b) Class 物件 (reflect也會使用Class,如果只是使用Class中的cast,那還是傳統的RTTI)
     c) instanceof & isInstance()

EX :
其執行結果為
In main
Yummy
Loading Candy
True
After creating candy
Loading gum
After creating gum
Loading cookie
After creating cookie


2.Reflection : 在程式運行時,探索編譯時未知的class並且使用他,似乎也能和Proxy design pattern配合使用,而他的使用方法主要為Class這東西,再配合java.lang.reflect library,可以探知class中的field、method、constructor甚至implement的interface


與傳統的RTTI相較,reflection並不需載入.class文件(畢竟他是在運行時抄你家...)
Proxy design pattern依目前所看,其含意似乎為
1.將主要的核心部分隱藏
2.利用另一個物件來執行核心部分
3.可以在此物件做修改(新增或刪除)
有點像代理人的身分

EX:
其執行結果為
public void Ted.miue()
public void Ted.move()
public void pet.ShowName()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public Ted(java.lang.String)

在這例子我主要使用的為getMethod , getConstructor
可以發現當我們使用reflection,我們幾乎把這個class的身家都給查光了!
所以利用此方法,我們可在運行期間去做查詢,並發現此class的型態,然後去使用他,而最大應用在於network,畢竟在client端使用者會怎麼使用我們的程式通常未知,這看起來好像是個大坑...

沒有留言:

張貼留言