Java — BigDecimal и отражение

когда я проверяю параметр метода, который находится в классе, использующем отражение Java для java.math.BigDecimal и java.lang.String isPrimitive(), возвращайте false. да они не примитивные а i want to differnciate between user defined class and these java class

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

на основе приведенного выше кода я установил true или false methodParams.setPrimitive(true); я сделал это, потому что есть несколько случаев, когда я получаю пользовательский объект, в моем случае com.hexgen.ro.request.CreateOrderRO

так как это установить?

также с помощью отражения я получаю имя класса, объявленные в нем методы и тип аргументов для метода.

Но я не могу получить имя аргумента, например, если бы я объявил метод, подобный следующему:

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

}

в приведенном выше коде я могу получить следующее

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

Но i also want to get int a and String b тип аргумента, а также объявленное имя переменной

Как это сделать.

Пожалуйста, помогите мне сделать это.

Наилучшие пожелания


person Java Questions    schedule 26.04.2013    source источник
comment
Я не верю, что байт-код Java сохраняет имена для параметров метода.   -  person PM 77-1    schedule 26.04.2013
comment
хорошо, чем это значит, что это невозможно, верно?   -  person Java Questions    schedule 26.04.2013
comment
См. stackoverflow.com/questions/2237803/   -  person PM 77-1    schedule 26.04.2013


Ответы (3)


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

Чтобы ответить на ваш второй вопрос, имена параметров метода не сохраняются во время выполнения. Об этом свидетельствует тот факт, что Method< /a> может сообщать только о формальных типах своих параметров, а не о том, как они называются.

EDIT: похоже, что обнаружение имен параметров метода во время выполнения возможно возможно, но только при компиляции с отладочной информацией и использовании чего-то вроде Spring ParameterNameDiscoverer. Подробнее см. в этом сообщении: Получение имени параметра метода (кредит комментарий PM 77-1). ИМХО любое серьезное решение, требующее компиляции с отладочной информацией, является серьезным недостатком дизайна.

person Paul Bellora    schedule 26.04.2013

Если вы компилируете с отладочной информацией, вы можете получить имена параметров. Вы можете скомпилировать с отладкой, используя аргумент -g

В противном случае имена параметров не сохраняются.

Чтобы отличить определяемый пользователем класс, вы можете проверить имя пакета. Вы можете вести список пакетов, которые вы хотите определить как определенные пользователем, или вести список пакетов, которые вы не называете определенными пользователем.

Причина в том, что если вы используете какую-либо стороннюю библиотеку, то классы этих библиотек определяются пользователем или нет?

person Bhushan Bhangale    schedule 26.04.2013

У вас может быть метод 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;
}
person rajesh    schedule 26.04.2013