1

当我使用java反射检查类中方法的参数java.math.BigDecimaljava.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 设置为 falsemethodParams.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参数的类型以及声明的变量名

这个怎么做。

请帮我完成这件事。

此致

4

3 回答 3

2

没有特殊的标志可以区分 Java API 类和BigDecimal用户定义的类(如CreateOrderRO. 您将需要检查它们的包名称或跟踪一组您想要区别对待的类。

要回答您的第二个问题,方法参数的名称不会在运行时维护。这反映在 aMethod只能报告其参数的形式类型,而不是它们的名称。

编辑:看起来在运行时发现方法参数名称可能的,但前提是使用调试信息进行编译并使用类似 Spring 的ParameterNameDiscoverer. 有关更多详细信息,请参阅此帖子:获取方法参数的名称(归功于PM 77-1 的评论)。恕我直言,任何需要使用调试信息进行编译的严肃解决方案都是严重的设计缺陷。

于 2013-04-26T05:29:55.657 回答
1

如果您使用调试信息进行编译,那么您可以获得参数名称。您可以使用-g参数进行调试编译

否则不保留参数名称。

为了区分用户定义的类,您可以检查包名称。您可以维护一个您想要称为用户定义的包列表或维护您不称为用户定义的包的列表。

原因是如果您使用任何第三方库,那么这些库的类是否是用户为您定义的?

于 2013-04-26T05:30:14.343 回答
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;
}
于 2013-04-26T05:32:26.767 回答