我不熟悉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)
有没有办法解决这个问题?
假设您有这个类:
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();
}
}
}
请注意,对于原始值,不需要传递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方法,通过反射,您有很多不必要的代码。 您不需要为该类调用构造函数 您不需要内省类字段 由于您正在调用静态方法,因此甚至不需要真正的对象来调用该方法。 您可以修改以下代码来满足您的需求: