gpt4 book ai didi

java - char[] 到方法参数的 java 类的完整量化名称

转载 作者:行者123 更新时间:2023-11-29 04:46:46 25 4
gpt4 key购买 nike

java中的反射问题

样本类

Class Question{
public int a ( String a, char[] c,int b) { return b; }
}

通过反射获取方法名和参数的方法

 public Method getMethodWithParams(Class<?> klasa, String methodName, Class<?>[] params) throws
SecurityException, NoSuchMethodException {
Class<?>[] primitivesToWrappers =
ClassUtils.primitivesToWrappers(params);
Method publicMethod = MethodUtils.getMatchingAccessibleMethod(klasa,
methodName,
primitivesToWrappers );
System.out.println(publicMethod.toGenericString());

return publicMethod;
}

private void printParams(Type[] types) throws ClassNotFoundException {

for (Type genericParameterType : types) {
System.out.println(genericParameterType.toString());

}

}

主程序

Question cls = new Question();
Class<?>[] paramString = new Class<?>[3];
paramString[0] = String.class;
paramString[1] = char[].class;
paramString[2] = int.class;
Method methodParams1 = getMethodParams(cls.getClass(),"a", paramString);
System.out.println(methodParams1.getName());
Type[] genericTypes = methodParams1.getParameterTypes();
printParams(genericTypes);

输出是:

a

class java.lang.String

class [C

int

问题是下一个测试失败了

Character testCharacterObjArray = new Character[]
Class<?> aClass = ClassUtils.getClass("[C", true);
Assert.assertEquals(testCharacterObjArray.getClass(), aClass);

ClassUtils 来自 org.apache.commons.lang3

正在寻找一个库来获取“[Ljava.lang.Character;”而不是“[C”,因为 ClassUtils.primitivesToWrappers() 似乎失败了。

解决方案基于 stephen :

public Class<?> convertStringToClass(String str) throws
ClassNotFoundException {
Class<?> aClass = ClassUtils.getClass(str, true);

if (aClass.isArray()) {

Class<?> primitiveToWrapper =
ClassUtils.primitiveToWrapper(aClass.getComponentType());
Object newInstance = Array.newInstance(primitiveToWrapper, 0);
System.out.println("****" + newInstance.getClass().getName());
return ClassUtils.
getClass(newInstance.getClass().getName(), true);
}
else {
return ClassUtils.primitiveToWrapper(aClass);
}

}

最佳答案

失败的原因:

Character[] testCharacterObjArray = new Character[]
Class<?> aClass = ClassUtils.getClass("[C", true);
Assert.assertSame(testCharacterObjArray.getClass(), aClass);

“[C”表示 char[] 而不是 Character[]

你不能在 char[].class 上调用 ClassUtils.primitivesToWrappers() 的原因是 char[] 是不是原始类型!

如果你想将一个原始数组类映射到一个包装类数组,那么:

  1. 使用Class.isArray() 判断类型是否为数组
  2. 使用Class.getComponentType()获取基类型
  3. 如果基类型是基本类型,则映射它。
  4. 使用Arrays.newInstance(baseType, ...)创建映射基类型的数组类型,创建一个数组,然后在其上调用getClass() .

关于java - char[] 到方法参数的 java 类的完整量化名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36841614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com