2014-01-08 89 views
0

我有一個Java的Android應用程序有點問題,我開發一個小遊戲,我加載動態有一些照片扔反思。使用對象的功能,通過反射在Java中的Android

我遇到了很多所謂的圖像(在我的遊戲我有圖片類的對象每個資源)對象的資產類別,其實這種圖像對象是一些額外的功能位圖。他們確實有一個叫做Resize的函數,我需要使用它。

目前我加載所有的圖像動態拋出反射在循環內,我有或多或少這樣的東西(不完全是這樣,但我已經寫了這樣,所以你可以瞭解它是如何作品):

Assets assetsRef = new Assets(); 
    String name = "picture97"; 
    picture = assetsRef.getClass().getField(name); 
    picture.set(picture, g.newImage(name, ImageFormat.RGB565)); 

但是,加載所有這些圖片後,我想應用稱爲Resize的函數。在其他方面,考慮到以前的代碼行,我想使用名爲picture97的對象中包含的函數,即在Assets類中的Image類型的變量。

任何人都可以幫到我嗎?我很確定應該有一種簡單的方法來通過反射來選擇一個對象,但到目前爲止我還沒有做到這一點。感謝

地塊作爲

+0

反射不是一個例外,不能被拋出。你的意思是'*通過*反思'? – EJP

+1

爲什麼不添加像Assets#getPicture(String name)這樣的東西(將它們存儲在一個由他們名字鍵入的Map中)並讓它返回一個Image,在這裏你可以輕鬆地調用這個resize方法?使用[反射]看起來過於複雜(https://developer.android.com/reference/java/lang/Class.html#getMethod%28java.lang.String,%20java.lang.Class%3C?%3E .. %29)。 – zapl

+0

@zapl同意 - 反射對於Spring或EJB容器等工具包非常有用。 (over)在日常代碼中使用反射通常表示一個糟糕的設計,恕我直言。 –

回答

0
Image image = (Image) picture.get(); // from Field to the object which is stored in the field 


Method method = image.getClass().getDeclaredMethod("Resize", (Class<?>[]) null); 
method.invoke(image, (Object[]) null); 

這也適用於調用方法不帶參數。 如果您的方法「調整大小」需要參數,您必須將它們的類型提供給調用以檢索方法以及將參數傳遞給調用。

方法用於研究類的方法的反思對象,調用「調用」的一個方法 - 對象需要作爲參數調用傳遞目標對象。 傳遞給getDeclaredMethod的Class []參數代表你想調用因爲有可能不止一個方法具有相同的名稱但不同的參數和參數類型(超載),說無效調整大小()的方法,無效調整大小的簽名( int x,int y)。 調用調用與直接調用對象上的方法相似,因此您需要提供常規調用中的參數。 因爲反射API必須提供調用你的方法的一個通用的方法,這種參數必須轉換爲Oject [],可想而知,否則Method.invoke 的重載必須是可用於任何方法簽名,因爲這包括你的自己定義的類類型,這是不可能的。 (好吧,如果在運行時生成類並在某些情況下調查代碼之後生成類,那麼動態類裝入將不得不重新生成,加載和編譯以及鏈接Method - 類,這將會是某種矯枉過正)。

但的確,在這種情況下,你們都知道你的對象的確切類型和你想要調用的方法(哪個不會改變),我寧願推薦你將該字段的值轉換爲Image,然後調用調整大小在該對象上,像這樣:

圖片圖像=(圖像)picture.get(); image.Resize();

+1

單純的代碼不是答案。你必須解釋。 – EJP

+0

增加了詳細的解釋。 – Peter

+0

當我嘗試寫:Image image =(Image)picture.get(); image.Resize(); 我得到以下編譯錯誤:類型字段中的方法get(Object)不適用於參數() – user2204353