java反射--注解的定义与运用以及权限拦截 (四)

2014-11-24 10:36:23 · 作者: · 浏览: 2

System.out.println(myClassAnnotation.desc()+" "+myClassAnnotation.uri());

//得到构造方法注解
Constructor cons = clazz.getConstructor(new Class[]{});

MyConstructorAnnotation myConstructorAnnotation = cons.getAnnotation(MyConstructorAnnotation.class);

System.out.println(myConstructorAnnotation.desc()+" "+myConstructorAnnotation.uri());

//获取方法注解
Method method = clazz.getMethod("setId", new Class[]{int.class});

MyMethodAnnotation myMethodAnnotation = method.getAnnotation(MyMethodAnnotation.class);

System.out.println(myMethodAnnotation.desc()+" "+myMethodAnnotation.uri());
//获取字段注解
Field field = clazz.getDeclaredField("id");

MyFieldAnnotation myFieldAnnotation = field.getAnnotation(MyFieldAnnotation.class);

System.out.println(myFieldAnnotation.desc()+" "+myFieldAnnotation.uri() );
}

}

输出:

The class name com.annotation.MySample
The class constructor com.annotation.MySample#MySample
The class method com.annotation.MySample#setId
The class field com.annotation.MySample#id

好了,上面是基本学习,我们在实际的项目中用在什么地方呢?我想我们都做过关于细粒度权限拦截的问题,在Struts2中可以根据登录用户所具有的的权限进行任一一个action方法的拦截,可以定义一个自定义方法注解,例如


[java]
@Retention(RetentionPolicy.RUNTIME)//代表Permission注解保留在的阶段
@Target(ElementType.METHOD)//标注在方法上面
public @interface Permission {

/** 模块 */
String module();
/** 权限值 */
String privilege();

}

@Retention(RetentionPolicy.RUNTIME)//代表Permission注解保留在的阶段
@Target(ElementType.METHOD)//标注在方法上面
public @interface Permission {

/** 模块 */
String module();
/** 权限值 */
String privilege();

}
比如有一个部门action,Department.action,有一个方法public String departmentlistUI(){}


可以这样定义方法


[java]
@Permission(module="department",privilege="view")
public String departmentlistUI(){
}

@Permission(module="department",privilege="view")
public String departmentlistUI(){
}
然后自定定义一个权限拦截器PrivilegeInterceptor.java并在struts.xml中注册,

在实现interceptor接口后,实现方法public String intercept(ActionInvocation invocation) throws Exception {}


在这里调用任一个action方法都会经过该拦截方法,通过invocation可以获取当前调用的action的名字,以及调用的action的哪个方法,


通过这段代码可以获取action名字和方法名


[java]
String actionName=invocation.getProxy().getActionName();
String methodName=invocation.getProxy().getMethod();

System.out.println("拦截到:action的名字:"+actionName+"方法名:"+methodName);

String actionName=invocation.getProxy().getActionName();
String methodName=invocation.getProxy().getMethod();

System.out.println("拦截到:action的名字:"+actionName+"方法名:"+methodName);
然后通过反射技术,获取该方法上的自定义权限注解,获取当前登录的用户(从session中),遍历当前用户的所拥有的权限组,并且遍历任一个权限组下的所有的权限,看是否包括该方法上注解所需的权限。这样就可以完成细粒度的action方法权限拦截了。


这只是个大体的思路

下面看一下,拦截器的具体实现该功能的代码


[java]
private boolean validate(ActionInvocation invocation) throws SecurityException, NoSuchMethodException {

String methodName=invocation.getProxy().getMethod();

Method currentMethod = invocation.getAction().getClass().getMethod(methodName);

if(currentMethod != null && currentMethod.isAnnotationPresent(Permission.class)){
//得到方法上的注解
Permission permission = currentMethod.getAnnotation(Permission.class);
//该方法上的所需要的权限
S