簡體   English   中英

作為實例方法調用

[英]invoking as instance method

后續功能是什么

Class c = Class.forName(handler);
Class partypes[] = new Class[1];
partypes[0] = new String().getClass();
Constructor ct = c.getConstructor(partypes);
Object arglist1[] = new Object[1];
arglist1[0] = address;
Method meth[] = c.getMethods();
Object arglist[] = new Object[7]; 
arglist[0] = new Integer(transid);
arglist[1] = transobj;            
arglist[2] = data_vec;            
arglist[3] = company_name;        
arglist[4] = new Boolean(flag_final_level_approval); 
flag_final_level_approval=true else false
arglist[5] = con;                
arglist[6] = scon;              
boolean found = false;
for(int i=0;i<meth.length;i++) {
    Method m = meth[i];
    if(m.getName().equals(functionName)) {
        result_vec = (Vector)m.invoke(ct.newInstance(arglist1),arglist);
    }
}

這似乎是濫用反射來掩蓋未能為我創建兩個交互Java組件的適當接口的失敗。 如果您為代碼段中的變量提供了具體的值,則有可能進行進一步的猜測...

Class c = Class.forName(handler);       // get class object for class with name <handler>
Class partypes[] = new Class[1];    
partypes[0] = new String().getClass();      // get class object for string
Constructor ct = c.getConstructor(partypes);    // get constructor of <handler> with signature <handler>(String)
Object arglist1[] = new Object[1]; 
arglist1[0] = address; 
Method meth[] = c.getMethods();         // get method objects from <handler>
Object arglist[] = new Object[7];       // collect a few params
arglist[0] = new Integer(transid);      // collect a few params
arglist[1] = transobj;              // collect a few params
arglist[2] = data_vec;              // collect a few params
arglist[3] = company_name;          // collect a few params
arglist[4] = new Boolean(flag_final_level_approval); // collect a few params
flag_final_level_approval=true else false   // this won't compile
arglist[5] = con;               // collect a few params
arglist[6] = scon;              // collect a few params
boolean found = false; 
for(int i=0;i<meth.length;i++) {
    Method m = meth[i];
    if(m.getName().equals(functionName)) {  // if method with name <functionName> found
        result_vec = (Vector)m.invoke(ct.newInstance(arglist1),arglist);  // invokes method on ct.NewInstance with arglist as param 
    }

有人試圖按名稱獲取類對象,創建此類的實例,並使用arglist中的參數調用某些方法。

創建了一個稱為handler的對象表示類:

Class c = Class.forName(handler);

然后,我們使用一個String參數查找其構造函數:

Class partypes[] = new Class[1];
partypes[0] = new String().getClass();
Constructor ct = c.getConstructor(partypes);

並在for循環中使用。

最后,對方法進行迭代,以查找一個在新創建的實例上調用的名為functionName

result_vec = (Vector)m.invoke(ct.newInstance(arglist1),arglist);

所有這些都等同於寫作(使用諸如groovy之類的語言)

target = new ${handler}
target.${functionName} ( ${transid}, ${transobj}, ${data_vec}, ${company_name}, ${lag_final_level_approval}, ${con}, ${scon});

就像所有同齡人所說的那樣,這顯然是對自省的一種濫用,例如通過遍歷方法,一個人可能會遇到多個具有正確名稱的方法,並嘗試調用所有方法,收集各種執行異常和奇怪的結果。

基本上,它將遍歷該類中的所有方法,並在找到匹配項時創建一個新實例(即ct.newInstance(arglist1)位),然后調用該方法(即m.invoke(..., arglist)位)。

您可能會更容易理解,因為:

Object instance = ct.newInstance(arglist1);
result_vec = (Vector) m.invoke(instance, arglist);

(總的來說,這是非常丑陋的代碼...)

有人正在使用令人發指的反射來調用handler類上的方法。

我很想知道為什么如此費力地放入該數組參數中的所有參數不能被傳遞到處理程序實例並被簡單地調用。

似乎有人決定采用復雜的實現方式來滿足(實際或想象中的)最終靈活性的要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM