2013-04-26 77 views
1

當我檢查使用java反射的類中的方法的參數java.math.BigDecimaljava.lang.StringisPrimitive()返回false。是的,他們不是原始的,但i want to differnciate between user defined class and these java classJava - BigDecimal和Reflection

Class[] parameterTypes = method2.getParameterTypes(); 

for (Class class1 : parameterTypes) { // check the parameter type and put them in to a ArrayList 
            methodParams = new MethodParams(); 
            strClassNameToFix = class1.getName(); 
            strClassname =strClassNameToFix.replaceAll("\\[L", "").replaceAll("\\;",""); 

             methodParams.setDataType(strClassname); 
             if(class1.isArray()){ 
              methodParams.setArray(true); 
             } 
             if(class1.isPrimitive()){ 
              methodParams.setPrimitive(true); 
             } 
             tempParamsList.add(methodParams); 
          } 

基於上面的代碼我設置的假methodParams.setPrimitive(true);真的,我已經這樣做了,因爲只有少數情況下,我得到的用戶定義的對象,在我的情況com.hexgen.ro.request.CreateOrderRO

所以如何設置?

也使用反射我得到的類的名字,它聲明的方法和參數的鍵入方法。

,但我沒能獲得參數名稱一樣,如果我已經宣佈類似下面的方法:

class test{ 
    public String testMethod(int a, String b){ 
    return "test"; 
    } 

} 
在上面的代碼中,我能夠得到folloing

Class name : test 
Method name : testMethod 
Arguments Type : int and String 

i also want to get int a and String b的參數類型,以及聲明的變量名

如何做到這一點。

請幫我完成這件事。

問候

+0

我不相信Java字節碼保留方法參數的**名稱**。 – 2013-04-26 05:26:59

+0

不錯,比它的意思是說這是不可能的吧? – 2013-04-26 05:28:52

+1

請參閱http://stackoverflow.com/questions/2237803/can-i-obtain-method-parameter-name-using-java-reflection – 2013-04-26 05:31:04

回答

2

沒有特殊標誌由用戶定義的類象CreateOrderRO區分像BigDecimal一個Java API類。你將需要檢查他們的軟件包名稱或跟蹤一組你想與別人區別對待的類。

要回答你的第二個問題,方法參數的名稱不保持在運行。這反映在一個事實上,即一個Method只能報告其參數的形式類型,而不是它們所稱的參數。

編輯:它看起來像在運行時發現方法的參數名稱爲可能的,但前提是與調試信息編譯和使用類似Spring的ParameterNameDiscoverer。看到這個職位的更多細節:Getting the name of a method parameter(信貸到PM 77-1's comment)。恕我直言,任何需要編譯調試信息的嚴肅解決方案都是嚴重的設計缺陷。

1

如果使用調試信息進行編譯,則可以獲取參數名稱。您可以使用-g參數進行調試編譯

否則參數名稱不會保留。

爲了區分用戶定義的類,您可以檢查包名。您可以維護一個列表包,您希望按照用戶定義的方式定義列表包,或者維護您沒有定義爲用戶定義的包列表。

原因是,如果你使用任何第三方庫,然後這些庫的類用戶爲您或不定義?

1

你可以有一個方法isPrimitive()(雖然我想一個更好的名字,使用您使用相同的名稱)會做這樣的事情:

boolean isPrimitive(Class class1) throws ClassNotFoundException { 

    String className = class1.getName(); 
    if (className.equals("java.math.BigDecimal")|| className.equals("java.lang.String")) { 
     return true; 
    } 
    return false; 
}