gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:07:43 26 4
gpt4 key购买 nike

据我所知,当类具有public 时,不可能通过经典方式为Java 内部包中的类成员添加 protected 访问修饰符(例如C# 中的internal protected) 访问修饰符。您知道执行此操作的任何方法或设计模式吗?

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

最佳答案

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

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

更新

无法在编译时强制执行此类限制。但在运行时,您有多种选择,例如使用 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 :)");
}
}
}
}

关于java - Java 中的内部包保护访问修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23888814/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com