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端使用者會怎麼使用我們的程式通常未知,這看起來好像是個大坑...
沒有留言:
張貼留言