Java 如何将受保护的方法访问限制为只访问子类

Java 如何将受保护的方法访问限制为只访问子类,java,aspectj,Java,Aspectj,我们如何将任何受保护方法的访问限制为任何包中的子类,而不是同一包中的类 如果任何类不是子类并且在同一个包中,它也必须抛出类似“protectedmethod”的异常 编辑:是否有任何方法可以检查调用类名实例,然后我们可以使用实例验证是否不可能。您可以在protectedmodifier(同一包中的子类+类)和默认修饰符(同一包中的类)之间进行选择。没有第三种选择 此外,您无法在运行时轻松地强制执行该操作,因为查找调用代码的类名和包并不简单。见: 一个选择是使用。它甚至可以在编译时拒绝试图从同一个

我们如何将任何受保护方法的访问限制为任何包中的子类,而不是同一包中的类

如果任何类不是子类并且在同一个包中,它也必须抛出类似“protectedmethod”的异常


编辑:是否有任何方法可以检查调用类名实例,然后我们可以使用实例验证是否不可能。您可以在
protected
modifier(同一包中的子类+类)和默认修饰符(同一包中的类)之间进行选择。没有第三种选择

此外,您无法在运行时轻松地强制执行该操作,因为查找调用代码的类名和包并不简单。见:


一个选择是使用。它甚至可以在编译时拒绝试图从同一个包中访问
受保护的
方法而不是子类的代码(借助
声明警告
声明错误
指令)。您可能希望只包含一些编译时注释,如
@子类
。请参阅:和。

简单:从包中删除所有其他类,只保留基类

这意味着可以访问您的类的类只能来自另一个包

如果另一个库复制了您的包名,您可以轻松地检查调用者的包并断言它与您的包不同:

if (getClass().getPackage().equals(MyBaseClass.class.getPackage())
    throw new IllegalAccessError(); // or similar
仅供参考
getClass()
为您提供了
this
的类,它将是子类的类

编辑: 要查找调用方的类,请使用以下代码:

Class<?> callerClass = Class.forName(Thread.currentThread().getStackTrace()[2].getClassName());
Class callerClass=Class.forName(Thread.currentThread().getStackTrace()[2].getClassName());

如何获取调用方对象的类名,然后使用instanceof进行比较。您可以通过检查
Thread.currentThread().getStackTrace()
来获取调用方的类。见编辑后的答案