gpt4 book ai didi

java - Java反射“调用”方法的行为不一致

转载 作者:行者123 更新时间:2023-11-30 05:28:19 26 4
gpt4 key购买 nike

请参阅这些示例类。

A.java:

// A is not public
class A
{
public static void foo()
{

}
}


B.java:

package p;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class B
{
public void invoke() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException
{
Class clazz = Class.forName("A");
Method method = clazz.getDeclaredMethod("foo", new Class[0]);
method.invoke(null, new Object[0]);
}
}


C.java:

import java.lang.reflect.InvocationTargetException;

public class C extends p.B
{
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException
{
C c = new C();
c.invoke();
}

// @Override
// public void invoke() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException
// {
// Class clazz = Class.forName("A");
// Method method = clazz.getDeclaredMethod("foo", new Class[0]);
// method.invoke(null, new Object[0]);
// }
}


C语言中main中的“调用”方法失败,原因是:

IllegalAccessException:类p.B无法使用修饰符“ public static”访问类A的成员

如果C中的“调用”方法与p.B中的替代方法完全相同。但是,如果不加注释,则不会引发任何异常。

为什么会有所不同?

最佳答案

A是包专用的。由于AC在同一(默认)程序包中,因此可以合法地从类A.foo()中的任何代码调用C,但不能在其他类中的B中调用该代码。

如果覆盖该方法,则会从同一包中调用A.foo()。如果不重写该方法,则会从其他程序包中的代码中调用A.foo(),这是非法访问。

您可以通过在相应的A.foo()方法中添加语句invoke()来复制类似的行为。但是,在这种情况下,您将得到编译错误而不是运行时错误。

关于java - Java反射“调用”方法的行为不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58082798/

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