打字猴:1.700446821e+09
1700446821
1700446822 @Retention(RetentionPolicy.RUNTIME)
1700446823
1700446824 @Target(ElementType.TYPE)
1700446825
1700446826 @interface Access{
1700446827
1700446828 //什么级别可以访问,默认是管理员
1700446829
1700446830 CommonIdentifier level()default CommonIdentifier.Admin;
1700446831
1700446832 }
1700446833
1700446834 该注解是标注在类上面的,并且会保留到运行期。我们定义一个资源类,代码如下:
1700446835
1700446836 @Access(level=CommonIdentifier.Author)
1700446837
1700446838 class Foo{
1700446839
1700446840 }
1700446841
1700446842 Foo类只能是作者级别的人访问。场景都定义完毕了,那我们看看如何模拟ACL的实现,代码如下:
1700446843
1700446844 public static void main(String[]args){
1700446845
1700446846 //初始化商业逻辑
1700446847
1700446848 Foo b=new Foo();
1700446849
1700446850 //获取注解
1700446851
1700446852 Access access=b.getClass().getAnnotation(Access.class);
1700446853
1700446854 //没有Access注解或者鉴权失败
1700446855
1700446856 if(access==null||!access.level().identify()){
1700446857
1700446858 //没有Access注解或者鉴权失败
1700446859
1700446860 System.out.println(access.level().REFUSE_WORD);
1700446861
1700446862 }
1700446863
1700446864 }
1700446865
1700446866 看看这段代码,简单、易读,而且如果我们是通过ClassLoader类来解释该注解的,那会使我们的开发更加简洁,所有的开发人员只要增加注解即可解决访问控制问题。注意看加粗代码,access是一个注解类型,我们想使用Identifier接口的identify鉴权方法和REFUSE_WORD常量,但注解是不能继承的,那怎么办?此处,可通过枚举类型CommonIdentifier从中间做一个委派动作(Delegate),委派?没看到!你可以让identify返回一个对象,或者在Identifier上直接定义一个常量对象,那就是“赤裸裸”的委派了!
1700446867
1700446868
1700446869
1700446870
[ 上一页 ]  [ :1.700446821e+09 ]  [ 下一页 ]