如何使用java反射将基元类型值赋给方法args?

3z6pesqy  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(342)

我对java反射概念还不熟悉。我需要使用java反射从特定类访问一个方法。这个方法有三种不同的论点,

public void print(int start, String middle, int end) {
   System.out.println(start);
   System.out.println(middle);
   System.out.println(end);
}

我试着这样调用这个方法,

...
method.invoke(null, "middle", null);
...

我有非法辩论例外。我知道null对于 Package 器类型args是可以接受的,但是我只是尝试了这个方法来了解它是如何工作的。
所以,我的主要问题是,如何通过反射将基元类型值传递给方法参数?另外,如何通过反射传递基元类型arg的默认值(例如:假设在运行时我不需要end arg值,那么如何为end arg传递0)
有办法解决这个问题吗?

xe55xuns

xe55xuns1#

假设您有这样一个类:

public class SomeClass {

    public void print(int start, String middle, int end) {
        System.out.println(start);
        System.out.println(middle);
        System.out.println(end);
    }

}

您可以使用以下代码:
使用反射示例化类
获取所需的方法
使用反射调用所需的方法

public class SomeOtherClass {

    public static void main(String... args) {
    try {
        var instance = Class
        .forName(SomeClass.class.getName())
        .getConstructor()
        .newInstance();
        var printMethod = SomeClass.class.getMethod("print", int.class, String.class, int.class);
        printMethod.invoke(instance, 0, "it's me", 0);
    } catch (NoSuchMethodException | ClassNotFoundException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
        System.err.println("An error has occurred while accessing method");
        e.printStackTrace();
    }
    }

}

注意,对于原语值,不需要传递is null . 对于这些情况,您需要提供一个值,这反过来意味着反射地调用方法,如下所示: printMethod.invoke(instance, 0, "it's me", 0); 请注意,这与直接调用方法相同,在本例中也是尝试传入 null 作为整数的方法参数将导致编译错误。

相关问题