3

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

为什么在 Java 中没有语法支持来做到这一点?(或者为什么它在 C# 中?)

4

1 回答 1

3

在 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 :)");
             }
         }
     }
}
于 2014-05-27T12:17:29.507 回答