当前位置: 首页 > 知识库问答 >
问题:

如何使用Java反射将基元类型值分配给方法args?

司空劲
2023-03-14

我不熟悉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);
...

我得到了IllegalArgumentException。我知道null对于包装器类型args是可以接受的,但我只是尝试了这个方法来了解它是如何工作的。

所以,我的主要问题是,如何通过反射将基元类型值传递给该方法参数?此外,如何通过反射传递基元类型arg的默认值?(例如:假设在运行时我不需要end arg值,那么如何为end arg传递0)

有没有办法解决这个问题?

共有1个答案

弘涛
2023-03-14

假设您有这个类:

public class SomeClass {

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

}

您可以使用以下代码:

  1. 使用反射实例化类
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();
    }
    }

}

请注意,对于原始值,不需要传递isnull。对于这些情况,您需要提供一个值,这反过来意味着像这样反射地调用方法:

printMethod.invoke(实例,0,"it's me",0);

请注意,这与直接调用该方法是一样的,在这种情况下,尝试传入null作为整数的方法参数将导致编译错误。

 类似资料:
  • 问题内容: 我有两节课: 我有一个实例B。如何调用A.method()从b?基本上,效果与super.method()从调用相同B。 但是上述代码仍会调用。 问题答案: 如果使用的是JDK7,则可以使用MethodHandle实现此目的:

  • 问题内容: 这是我写该行时的错误: /ChatApp/ViewController.swift:27:42:无法将“ ViewController”类型的值分配给“ UITextFieldDelegate”类型的值? 这是我的Swift代码(ViewerController.swift): 问题答案: 该生产线将导致错误,因为你尝试分配作为的。 但是,你 是不是 一个。为了使您的课程成为此类委托,

  • 问题内容: 更新到xcode 8 beta 6后,出现错误 无法将’()-> Void’类型的值分配给’(()-> Void)!’ 在以下func块的第三行: 关于修复的任何建议? 问题答案: 看来您的问题与此有关: SE-0103 尝试将您的方法标头追踪到: 与往常一样,来自新Beta的诊断消息是如此混乱和不足,但是将您的媒体资源设置为非可选将为您提供更多有用的信息。

  • 我尝试了几种解决方案,但都不管用

  • 这段代码给出了一个运行时错误: < li >为什么< code>b.get()不会触发运行时错误? < li >为什么只有当我试图获取class变量的类时才会出现运行时错误? 更准确地说:为什么编译器仅为第二个(导致异常)在字节码中插入指令?

  • 问题内容: 当使用反射从另一个主要方法调用Java类的主要方法时, 我应该创建newInstance()还是直接调用main(),因为它是静态的。 问题答案: 对于您陈述的要求(动态地调用随机类的main方法,通过反射,您有很多不必要的代码。 您不需要为该类调用构造函数 您不需要内省类字段 由于您正在调用静态方法,因此甚至不需要真正的对象来调用该方法。 您可以修改以下代码来满足您的需求: