Java自定义注释以限制对方法的访问

时间:2011-07-14 08:37:00

标签: java annotations

我正在构建一个两层的应用程序。 Web层和业务层。

在业务层内部,我有一些可以在业务层或Web层中调用的公共方法。

我只想从网络层(安全的)中调用其中一些方法。

我想知道是否可以在我的业务层中创建注释,例如@Public,这意味着我可以从Web层调用此方法,@Private所以我不应该使用此方法网络层。

当我尝试从网络层调用@private方法时(在eclipse中)它会给我一个警告?

同样:我可以自动列出私有和公开的所有方法吗?

3 个答案:

答案 0 :(得分:0)

我想到的第一件事就是只有在设计不良的双层应用程序中才需要这样做。

您可以使用访问控制来确保web gui只能访问安全方法,并将其他方法保留在业务层中。

可能只需将您不希望被Web界面使用的那些“公共”方法设为私有;这样你就可以在商业逻辑的公共,安全和方法中使用它们。

虽然不知道你的项目是如何建立的,但提供具体的例子是不可能的。

但是说;你可以:
com.somecompany.gui>包含所有web-gui的东西
com.somecompany.logic>包含业务逻辑。

在逻辑包中,您创建具有要从gui使用的公共方法的类,以及私有或 - 如果其他逻辑组件需要 - 包无法从gui包访问的包私有(受保护)方法。这样,您就可以将逻辑与界面分开,而无需您想要的注释。

答案 1 :(得分:0)

总的来说,我会说:是的,它可以奏效。至少要产生编译器警告。

我们有方法的@Override注释。此注释用于类似的原因:在编译时验证是否满足某些条件。在这种情况下:带注释的方法会覆盖超类中的方法,或者实现接口方法或抽象方法。如果验证程序找不到,则情况并非如此,则编译器将产生编译时错误。

所以它也应该在这里。我们可以想到像

这样的注释
 @Layer("servicelayer")                // class annotation

 @Private(layer="servicelayer")        // method annotation

现在我们可以在编译时验证注释方法只能从具有相同图层注释的类中调用。如果不满足条件,编译器可能会产生警告(iaw:如果我们不小心从Web层类调用内部服务层方法,编译器可以检测到。

答案 2 :(得分:0)

AFAIK您不能让Eclipse使用注释来确定您是否可以从某个文件访问方法。为此,Eclipse必须知道该文件是Web层还是业务层的一部分。

为了列出具有特定注释的所有方法,您可以在运行时使用反射。在Eclipse中可能有过滤器,但我不知道任何基于注释的过滤器。

也许你应该选择另一种方法,我将很快描述我们如何做到这一点:

我们的服务可以实现两个接口:

  • 一个包含网络层可能看到的所有方法的公共接口
  • 一个私有接口,包含业务逻辑内部的所有方法

我们将这些接口拆分为两个eclipse项目 - 一个公共api项目和一个包含服务和内部api的实现项目 - 只允许从Web层访问公共api项目。

由于我们的服务(EJB 3.0)需要一个接口,如果我们有内部方法,我们必须添加内部接口。但是,使用其他技术(如EJB 3.1),您也可能只提供公共接口。

另一种方法可能是将接口拆分为两个包,例如myproject.api.pub(public是关键字)和myproject.api.internal,然后在Eclipse中使用基于包的过滤器。