我想知道是否有可能只允许某组类执行一个函数。
我有一个方法:setPermission()
只有整个项目中的某些类才能调用此方法。
有人建议让调用类在this
中传递,引用当前对象并确保它是instanceof
允许的类。但是任何类都可以传入一个允许类的实例,所以这似乎是一个糟糕的解决方案。
我偶然发现了Exception().getStackTrace()[1].getClassName();
,但我还是相信这是一项非常昂贵的操作。
有没有正确的方法呢?
答案 0 :(得分:0)
使用marker interface(没有任何方法的人):
public interface Permissible {}
然后让允许调用方法的类实现它,然后将方法的参数类型更改为此接口:
public static void myMethodForObjectsThatHavePermission(Permissible obj) {
//
}
答案 1 :(得分:0)
无法强制执行无法解决的问题,但您可以在一个类上拥有大部分功能,setPermission()
在子类上,并让客户通过工厂获取类的实例声明为返回父类的方法,但实际上返回子类的实例。这样,应该调用setPermission()
并且知道它的代码可以进行向下转换并调用它,并且该类的所有其他用户甚至都不会看到它。
public class Service {
protected boolean permission = false;
protected Service() {
/* control creation */
}
public static Service getService() {
return new RealService();
}
public void doStuff() {
/* the public API side of the service */
}
}
public class RealService extends Service {
protected RealService() {
/* control creation */
}
public void setPermission(boolean permission) {
this.permission = permission;
}
}
合法的来电者可以这样做:
public class Legitimate {
public void method() {
Service service = Service.getService();
RealService real = (RealService) service;
real.setPermission(true);
}
}
但是,如果所有合法的调用者都可以放在同一个包中,而其余的都在包外,那么setPermission()
的包私有访问(无访问修饰符)就足够了。
这并不能阻止恶意调用者绕过限制,但它确实避免了人们调用setPermission而没有意识到他们不应该这样做,因为setPermission不会出现在IDE中的自动完成(intellisense)中。
答案 2 :(得分:0)
听起来像你在寻找OSGi(en.wikipedia.org/wiki/OSGi)。第三方开发人员应该编写捆绑包,而使用OSGi可以限制捆绑包的功能。请注意:"安全性通过将捆绑功能限制为预定义功能来处理安全方面的层。"以下是讨论您案例的主题:Managing access to OSGI bundles