【问题标题】:Java Reflections - invoke method with BigInteger argumentJava Reflections - 使用 BigInteger 参数调用方法
【发布时间】:2018-01-21 17:26:05
【问题描述】:

我需要只使用字符串来调用一个类(在本例中称为 Foo)中的方法。例如,在我的情况下,将 BigInteger 类作为参数传递不是一个选项。

当我使用 java.lang.String 时,我的代码工作正常,但如果尝试使用其他类型,例如 BigInteger,则会抛出“java.lang.IllegalArgumentException:参数类型不匹配”

这是我正在测试反射的类:

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。

总结一下我的问题:如果类型本身应该作为字符串提供,我怎么可以使用与使用 java 反射的字符串不同的参数?

【问题讨论】:

标签: java reflection


【解决方案1】:

您首先说:该方法需要一个 BigInteger 对象:

Method m = clazz.getMethod("setAge", new Class[] 
 {Class.forName("java.math.BigInteger")});

然后你传递“12”:

m.invoke(obj, "12");

"12" 是 String,而不是 BigInteger

解决方案:要么让该方法接受一个字符串,要么传递一个 BigInteger 实例,例如 new BigInteger("12") 作为参数!

并且提示:您不需要在这里使用Class.forName() - 只需使用BigInteger.class 代替。反射很容易出错——所以当你在编译时已经知道类时不要使用字符串文字。

【讨论】:

    【解决方案2】:

    您将参数传递给 setAge() 方法的方式存在问题。 setAge 方法接受 Biginteger 作为参数,并且您正在传递 String。

    改变

    m.invoke(obj, "12");
    

     m.invoke(obj, BigInteger.valueOf(12L));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-04
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多