当我使用java.math.BigDecimal和java.lang.String的java反射检查类中的方法的参数时,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类型以及声明的变量名
如何做到这一点。
请帮我把这件事做完。
诚挚的问候
发布于 2013-04-26 13:29:56
没有特殊的标志来区分像BigDecimal这样的Java API类和像CreateOrderRO这样的用户定义类。您需要检查它们的包名,或者跟踪一组您希望区别对待的类。
为了回答您的第二个问题,在运行时不维护方法参数的名称。Method只能报告其参数的正式类型,而不能报告它们的名称,这一事实反映了这一点。
Spring:看起来在运行时发现方法参数名称是可能的,但前提是使用调试信息进行编译并使用类似的ParameterNameDiscoverer。更多细节请看这篇文章:Getting the name of a method parameter (归功于PM 77-1's comment)。任何需要使用调试信息进行编译的严重解决方案都是一个严重的设计缺陷。
发布于 2013-04-26 13:30:14
如果使用调试信息进行编译,则可以获得参数名称。可以使用-g参数使用debug进行编译
否则,不会保留参数名称。
为了区分用户定义的类,您可以检查包名称。您可以维护您想要定义为用户定义的包列表,也可以维护您不将其定义为用户定义的包列表。
的原因是如果你正在使用任何第三方库,那么这些库的类是不是用户为你定义的?
发布于 2013-04-26 13:32:27
你可以有一个方法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;
}https://stackoverflow.com/questions/16229278
复制相似问题