【发布时间】:2015-10-16 07:50:27
【问题描述】:
使用反射时我需要注意哪些潜在问题。 我在反思中很困惑,为什么java提供这种类型的功能来访问私有数据成员。
私人: 就像我想的那样,只有声明它的类才能看到它。
那为什么可以访问其他类的私有内容呢? 这个术语(反射)完全超出了我对 java 中私有(访问说明符)属性的概念。
我访问了很多关于这个主题的链接,但没有给出关于这个主题的完整解释。 例如:
package example;
import java.lang.reflect.Method;
class A{
private void privateMethod(){
System.out.println("hello privateMethod()");
}
}
class B{
public static void main(String[] args) throws Exception {
A d = new A();
Method m = A.class.getDeclaredMethod("privateMethod");
m.setAccessible(true);
m.invoke(d);
}
}
那么请详细解释一下这种方法的场景? 我需要其他类中私有方法可访问性的优点和缺点吗?
【问题讨论】:
-
大多数常规项目不需要任何反思,因为如果您这样做,您只需要重新考虑您的架构(当然也有例外)。我经常使用反射的一个地方是在 UnitTests 中。您可以通过使用 UnitTests 中的反射更改私有字段来简单地尝试多种方案。例如布尔值。假设您有一个布尔设置,并且您想在 UnitTest 中测试这两种情况。您项目中的默认值为 false,因此您首先对其进行测试。然后您使用反射将其(临时)设置为 true 并测试其他场景。
-
谁能举个例子解释一下?因为它会非常清楚我的概念。
-
您用“安全”标记了您的问题。我想这就是你的误解所在。访问修饰符并不意味着是一种安全机制。它们旨在成为一种面向对象的设计工具。当您想向代码的“常规”客户端提供正确封装的代码,但仍希望让框架(如 JPA、依赖注入等)为您填充字段时,通过反射访问私有字段非常有用。
-
@JimmyJames 我并不是说安全不是问题。我是说访问修饰符不是安全问题的答案。它们并不是为了提供安全性。它们旨在提供封装。它们是一种设计工具。
标签: java reflection