2013-04-26 15 views
1

когда я проверяю параметр метода, который находится в классе, используя java-отражение для java.math.BigDecimal и java.lang.StringisPrimitive() return 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 байт сохраняет ** имена ** для параметров метода. –

+0

хорошо, чем он должен сказать, что это невозможно? –

+1

См. Http://stackoverflow.com/questions/2237803/can-i-obtain-method-parameter-name-using-java-reflection –

ответ

2

Там нет специального флага дифференцирования Java класса API как BigDecimal из определенного пользователя класса, как CreateOrderRO. Вам нужно будет либо изучить имена своих пакетов, либо отслеживать набор классов, которые вы хотите рассматривать по-другому от других.

Чтобы ответить на ваш второй вопрос, имена параметров метода не поддерживаются во время выполнения. Это отражается в том, что Method может сообщать только формальные типы своих параметров, а не то, что они называются.

EDIT: Это выглядит как открытие имен параметров методы во время выполнения является возможно, но только при компиляции с отладочной информацией и использовать что-то вроде весны ParameterNameDiscoverer. См. Это сообщение для получения дополнительной информации: Getting the name of a method parameter (кредит PM 77-1's comment). IMHO любое серьезное решение, требующее компиляции с отладочной информацией, является серьезным недостатком дизайна.

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; 
}