Java Reflections - 使用BigInteger参数调用方法

时间:2018-01-21 17:26:05

标签: java reflection

我只需要使用字符串调用类(在本例中称为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不同的参数吗?

2 个答案:

答案 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即可。反射很容易出错 - 所以当你在编译时已经知道了类时,不要使用字符串文字。