是否可以将方法执行限制为某个类?

时间:2014-04-04 23:05:28

标签: java

我想知道是否有可能只允许某组类执行一个函数。

我有一个方法:setPermission() 只有整个项目中的某些类才能调用此方法。

有人建议让调用类在this中传递,引用当前对象并确保它是instanceof允许的类。但是任何类都可以传入一个允许类的实例,所以这似乎是一个糟糕的解决方案。

我偶然发现了Exception().getStackTrace()[1].getClassName();,但我还是相信这是一项非常昂贵的操作。

有没有正确的方法呢?

3 个答案:

答案 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