详情:http://www.cnblogs.com/pepcod/archive/2013/02/16/2913474.html
实现要求
① 通过类中的注解,找到要执行的方法
② 通过类中的注解,通过传入的参数判断要不要执行这段代码
注解类:
package IMP;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 权限组成部分
* Created by sff on 2017/1/12.
*/
/** @Retention 表示需要在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括:
* SOURCE:注解将被编译器丢弃
* CLASS:注解在class文件中可用,但会被VM丢弃
* RUNTIME:VM将在运行期间保留注解,因此可以通过反射机制读取注解的信息
* */
@Retention(RetentionPolicy.RUNTIME)
/** @Target 表示该注解可以用于什么地方,可能的 ElementType 参数有:
* CONSTRUCTOR:构造器的声明
* FIELD:域声明(包括enum实例)
* LOCAL_VARIABLE:局部变量声明
* METHOD:方法声明
* PACKAGE:包声明
* PARAMETER:参数声明
* TYPE:类、接口(包括注解类型)或enum声明
*/
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface Auth {
public String id();
/**
* default 是默认的意思,@Auth(id = "45") 的意思就是被注解的对象的Auth对象id="45",authority="我是 45"
* @return
*/
public String authority() default "我是 45";
}
package IMP;
import java.lang.reflect.Method;
/**
* 权限判断
* Created by ASUS on 2016/12/6.
*/
public class User {
@Auth(id = "45")
public void validateAuth(String authority) {
try{
/** User.class.getMethod("validateAuth", String.class) 找到自己方法 ,通过判断,是不是进行if语句中的东西*/
Auth uc = User.class.getMethod("validateAuth", String.class).getAnnotation(Auth.class);
if(authority.equals(uc.authority())){
System.out.println("恭喜你,你有这个权限:"+authority);
}else{
System.out.println("对不起你没有这个权限,回家洗洗睡吧");
}
} catch (java.lang.NoSuchMethodException e){
System.err.println("找不到这个方法validateAuth"+e);
}
}
@Auth(id = "46", authority = "我是 46")
public void validate(String authority) {
System.out.println("我是 46");
System.out.println(authority);
}
@Auth(id = "47", authority = "我是 47")
public static void main(String[] args) throws Exception{
User u = new User();
/** 遍历方法,看看那个方法是我们要执行的 */
for (Method m : User.class.getDeclaredMethods()) {
Auth uc = m.getAnnotation(Auth.class);
if (uc.id().equals("45")) {
try{
/** 运行Method对象,有点像Field的get方法*/
m.invoke(new User(),"我是 45");
System.out.println("---------------------------------");
m.invoke(new User(),"我是 47");
} catch (java.lang.IllegalAccessException e){
System.err.println("执行方法出错了:"+m.getName());
} catch (java.lang.reflect.InvocationTargetException e) {
System.err.println("执行方法出错了:" + m.getName());
}
}
}
}
}
实现类的运行结果图:
实现类变形:
package IMP;
import java.lang.reflect.Method;
/**
* 权限判断
* Created by ASUS on 2016/12/6.
*/
public class User {
@Auth(id = "45")
public void validateAuth(String authority) {
try{
/** User.class.getMethod("validateAuth", String.class) 找到自己方法 ,通过判断,是不是进行if语句中的东西*/
Auth uc = User.class.getMethod("validateAuth", String.class).getAnnotation(Auth.class);
if(authority.equals(uc.authority())){
System.out.println("恭喜你,你有这个权限:"+authority);
}else{
System.out.println("对不起你没有这个权限,回家洗洗睡吧");
}
} catch (java.lang.NoSuchMethodException e){
System.err.println("找不到这个方法validateAuth"+e);
}
}
@Auth(id = "46", authority = "我是 46")
public void validate(String authority) {
System.out.println(authority);
}
@Auth(id = "47", authority = "我是 47")
public static void main(String[] args) throws Exception{
User u = new User();
/** 遍历方法,看看那个方法是我们要执行的 */
for (Method m : User.class.getDeclaredMethods()) {
Auth uc = m.getAnnotation(Auth.class);
if (uc.id().equals("45")) {
try{
/** 运行Method对象,有点像Field的get方法*/
m.invoke(new User(),"我是 45");
System.out.println("---------------------------------");
m.invoke(new User(),"我是 47");
} catch (java.lang.IllegalAccessException e){
System.err.println("执行方法出错了:"+m.getName());
} catch (java.lang.reflect.InvocationTargetException e) {
System.err.println("执行方法出错了:" + m.getName());
}
}
}
u.fun(u.getClass().getMethod("validate",String.class));
}
@Auth(id = "48")
public void fun(Method method) throws Exception{
User u = new User();
try{
System.out.println("=================================");
System.out.println("方法注解id:"+method.getAnnotation(Auth.class).id());
method.invoke(new User(),"我就是将要运行的方法:"+method.getName());
} catch (java.lang.IllegalAccessException e){
System.err.println("执行方法出错了:"+method.getName());
} catch (java.lang.reflect.InvocationTargetException e) {
System.err.println("执行方法出错了:" + method.getName());
}
}
}
结果: