System.out.println(myClassAnnotation.desc()+" "+myClassAnnotation.uri());
//得到构造方法注解
Constructor
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