gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:22:04 24 4
gpt4 key购买 nike

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

最佳答案

您首先说:该方法需要一个 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 即可。反射很容易出错 - 因此,当您在编译时已经知道该类时,请不要使用字符串文字。

关于Java Reflections - 使用 BigInteger 参数调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48369619/

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