Java中的内部包受保护的访问修饰符

时间:2014-05-27 11:57:16

标签: java design-patterns syntax protected package-private

据我所知,当其类具有internal protected访问修饰符时,在Java内部包受保护的访问修饰符(例如C#中的public)中添加类成员是不可能的经典方法。你知道这样做的任何方式或设计模式吗?

为什么在Java中没有语法支持? (或者为什么它在C#中?)

1 个答案:

答案 0 :(得分:2)

在Java中,最接近的是类成员的普通protected修饰符和类的package private。它们允许从同一个包以及继承类进行访问。

在实践中,您会发现Java包的名称类似于internal,暗示客户端不应直接使用此包中的类。

UPD

在编译时无法强制执行此类限制。但在运行时,您可以使用各种选项,例如使用Java安全性,反射,分析堆栈跟踪。但是你应该在每种情况下评估每种解决方案的优缺点。

只是为了好玩,你可以试试这个(我怀疑这在现实世界的项目中是有用的,也不确定这会对字节码生成代理或其他奇特的用例有多好):

public class Test {
     public void protectedInternal() {
         // If this method is not called from an inherited class.
         if (getClass() == Test.class) {
             StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
             StackTraceElement e = stackTrace[2]; // Corresponds to the caller stack frame.
             // Check the caller is from the allowed package.
             if (!e.getClassName().startsWith("my.package.")) {
                 throw new SecurityException("Sorry, this method is kind of protected internal :)");
             }
         }
     }
}