使用泛型在编译时调用自动拦截方法

时间:2015-09-11 17:08:51

标签: java generics access-control

我正在尝试如何将访问控制代码集成到我的项目中。我的想法是创建无访问控制的对象,专注于只做业务逻辑,然后在编译时用拦截公共方法调用的装饰器对象包装这些对象,执行通用访问控制检查,然后抛出授权异常或者调用基本方法。

因此,假设我有多个业务对象,如下所示:

public class Interactor
{
    public void Interact1()
    {
        // Do stuff
    }

    public void Interact2()
    {
        // Do stuff
    }

    // etc ...
}

不是为包含相同代码的每个类单独编写一个包装器,而是一遍又一遍:

public class RestrictedInteractor extends Interactor
{
    public void Interact1()
    {
        if (/* not authorized Interactor.Interact1 */)
            throw new AuthorizationException();
        super.Interact1();
    }

    public void Interact2()
    {
        if (/* not authorized for Interactor.Interact2 */)
            throw new AuthorizationException();
        super.Interact2();
    }

    // etc ...
}

这将是许多重复的样板代码。

我想编写一个可以执行此类操作的泛型类(尽管此代码只是乱码):

public class RestrictedClass<T> extends T
{
    public void Intercept(Method method)
    {
        if (/* not authorized T.method */)
            throw new AuthorizationException();
        super.method();
    }
}

然后我可以在任何需要的地方创建它的实例:

Foo foo = new Restricted<Foo>();
Bar bar = new Restricted<Bar>();
// etc

我无法使用Java动态代理,因为这些类需要具体,而不是接口。

那么,这甚至可能吗?如果是这样,我该怎么做呢?

1 个答案:

答案 0 :(得分:0)

你可以试试sharpie-tools

查看示例:Person.javatest cases

您所要做的就是创建一个身份验证包装器,它将用于包装所有功能。