gpt4 book ai didi

java - AccessibleObject 类的 setAccessible 方法背后有一个 boolean 参数的原因是什么?

转载 作者:搜寻专家 更新时间:2023-10-31 08:10:02 27 4
gpt4 key购买 nike

我是 Reflection 的新手,我有这样的疑问:

public void setAccessible(boolean flag) throws SecurityException

此方法有一个boolen 参数标志,表示任何字段或方法的新可访问性。
例如,如果我们尝试从类外部访问类的 private 方法,那么我们使用 getDeclaredMethod 获取该方法并将可访问性设置为 true,所以它可以被调用,比如:method.setAccessible(true);
现在在什么情况下我们应该使用 method.setAccessible(false); ,例如当有一个 public 方法并且我们将可访问性设置为 false 时可以使用它。但这有什么必要呢?我的理解清楚了吗?
如果没有使用 method.setAccessible(false) 那么我们可以像这样更改方法签名:

public void setAccessible() throws SecurityException

最佳答案

您可能一辈子都不会做setAccessible(false)。这是因为 setAccessible 不会永久更改成员的可见性。当你使用 method.setAccessible(true) 之类的东西时,你可以对 this method 实例进行后续调用,即使原始方法来源是私有(private)的

例如考虑这个:

A.java
*******
public class A
{
private void fun(){
....
}
}

B.java
***********
public class B{

public void someMeth(){
Class clz = A.class;
String funMethod = "fun";

Method method = clz.getDeclaredMethod(funMethod);
method.setAccessible(true);

method.invoke(); //You can do this, perfectly legal;

/** but you cannot do this(below), because fun method's visibilty has been
turned on public only for the method instance obtained above **/

new A().fun(); //wrong, compilation error

/**now you may want to re-switch the visibility to of fun() on method
instance to private so you can use the below line**/

method.setAccessible(false);

/** but doing so doesn't make much effect **/

}

关于java - AccessibleObject 类的 setAccessible 方法背后有一个 boolean 参数的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16230601/

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