我只需要使用字符串调用类(在本例中称为Foo)中的方法。例如,在我的情况下,将BigInteger类作为参数传递不是一个选项。
当我使用java.lang.String时,我的代码工作正常,但是如果尝试使用其他类型,例如BigInteger,则抛出“java.lang.IllegalArgumentException:argument type mismatch”
这是我正在测试反思的课程:
package com.test;
import java.math.BigInteger;
public class Foo {
private String name;
private BigInteger age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public BigInteger getAge() {
return age;
}
public void setAge(BigInteger age) {
this.age = age;
}
@Override
public String toString() {
return "Foo [name=" + name + ", age=" + age + "]";
}
}
我的目标是使用Java反射调用setAge(BigInteger age)方法。 这是我使用的代码:
package com.main;
import java.lang.reflect.Method;
public class Run {
public static void main(String[] args) {
try {
Class clazz = Class.forName("com.test.Foo");
Object obj = clazz.newInstance();
Method m = clazz.getMethod("setAge", new Class[]
{Class.forName("java.math.BigInteger")});
m.invoke(obj, "12");
System.out.println("after method call " + obj.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
不幸的是,在执行代码后,我得到了java.lang.IllegalArgumentException。
总结一下我的问题:如果类型本身应该以String形式提供,那么我可以使用与Strings不同的参数吗?
答案 0 :(得分:1)
将广告传递给 setAge()方法的方式存在问题。 setAge方法接受Biginteger作为争论而你正在传递String。
更改
m.invoke(obj, "12");
到
m.invoke(obj, BigInteger.valueOf(12L));
答案 1 :(得分:1)
首先说:该方法需要一个 BigInteger 对象:
Method m = clazz.getMethod("setAge", new Class[]
{Class.forName("java.math.BigInteger")});
然后你传递“12”:
m.invoke(obj, "12");
“12”是字符串,而不是 BigInteger !
解决方案:要么让该方法接受一个String,要么传递一个BigInteger实例,例如new BigInteger("12")
作为参数!
并提示:您无需在此使用Class.forName()
- 只需使用BigInteger.class
即可。反射很容易出错 - 所以当你在编译时已经知道了类时,不要使用字符串文字。