我知道我们可以通过反射访问私有构造函数,正如@Sanjay T. Sharma在回答我的问题时提到的:Does “instanceof Void” always return false?
不过,@ duffymo表示:
你可以通过反射访问私有的所有东西--方法、构造函数、数据成员,所有的东西。
1.如何访问私有方法和私有数据成员?
1.可以通过反射访问局部变量吗?
1.是否有办法防止任何人访问私有构造函数、方法和数据成员?
我知道我们可以通过反射访问私有构造函数,正如@Sanjay T. Sharma在回答我的问题时提到的:Does “instanceof Void” always return false?
不过,@ duffymo表示:
你可以通过反射访问私有的所有东西--方法、构造函数、数据成员,所有的东西。
1.如何访问私有方法和私有数据成员?
1.可以通过反射访问局部变量吗?
1.是否有办法防止任何人访问私有构造函数、方法和数据成员?
6条答案
按热度按时间bfnvny8b1#
1)如何访问私有方法和私有数据成员?
您可以在
setAccessible(true)
方法的帮助下完成此操作:2)是否可以通过反射访问局部变量?
不能。局部变量不能在创建它们的块之外访问(有人可能会说,您可以将这样的变量赋给
field = localVariable;
这样的字段,然后通过反射访问这样的字段,但这样我们将访问 value,而不是 variable)。3)是否有任何方法可以防止任何人访问私有构造函数、方法和数据成员?
我认为对于
constructors
或methods
,您可以使用stacktrace来检查它是否被Reflection
调用。对于字段,我找不到一个解决方案来防止通过反射访问它们。
[警告:这并没有得到任何人的认可,我只是受你的问题启发才写出来的。]
Test
主方法的输出:rsl1atfo2#
1.使用您链接到的答案中显示的方法:setAccessible(true),它是Field、Constructor和Method超类的方法。
1.没有。
1.不,除非代码运行在你控制的JVM中,在JVM中你安装了安全管理器,但是如果你给予某人一个jar文件,他使用这个jar文件中的类,他就可以访问所有的东西。
vybvopom3#
要访问****私有字段,您需要调用
Class.getDeclaredField(String name)
或enter code here
方法。检查以下简单代码:若要访问私有方法,您需要调用Class.getDeclaredMethod(字符串名称,Class[]参数类型)或Class.getDeclaredMethods()方法。
检查以下简单代码:
在http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html处读取详细信息
7eumitmz4#
zbdgwd5y5#
示例如下:
8wtpewkr6#
回答你的第三个问题:
1.是否有办法防止任何人访问私有构造函数、方法和数据成员?
答:
是的,您可以限制访问(当有人试图访问您的私有构造函数/方法/数据时,您可以抛出异常)
请参考以下示例:
这个例子是针对一个单例类的(签入构造函数),但是您仍然可以为想要阻止其他类访问的私有方法实现这个逻辑。
在这种情况下,您还将声明一个静态示例,并在私有方法中检查它的值,如果出现任何不需要的值,则抛出错误。