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