据我所知,当其类具有internal protected
访问修饰符时,在Java内部包受保护的访问修饰符(例如C#中的public
)中添加类成员是不可能的经典方法。你知道这样做的任何方式或设计模式吗?
为什么在Java中没有语法支持? (或者为什么它在C#中?)
答案 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 :)");
}
}
}
}