java自定义注解
java自定义注解的实现主要通过反射以及动态代理机制
java动态代理简单实例
package learnbasic.reflect.basicexample; public interface Subject { public int doSomething(int n); }
package learnbasic.reflect.basicexample; public class RealSubject implements Subject { @Override public int doSomething(int n) { int sum = 0; for (int j = 0; j < n; j++) { sum += j; } return sum; } }
package learnbasic.reflect.basicexample; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.text.Annotation; public class DynamicSubject implements InvocationHandler { private Subject sub; public DynamicSubject() { } public DynamicSubject(Subject sub) { this.sub = sub; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before doing something"); int sum = (int) method.invoke(sub, args); System.out.println("after doing something"); return sum; } }
package learnbasic.reflect.basicexample; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class Client { public static void main(String[] args) { RealSubject rs = new RealSubject(); // 在这里指定被代理类 InvocationHandler ds = new DynamicSubject(rs); // 初始化代理类 Class cls = rs.getClass(); Subject subject = (Subject) Proxy.newProxyInstance( cls.getClassLoader(), cls.getInterfaces(), ds); System.out.println(subject.doSomething(10)); } }
自定义实现类似spring jpa中@Query功能
首先定义自定义注解
package learnthread.myannations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyQuery { String value() default ""; String count() default ""; }
package learnthread.myannations; public interface IUserService { @MyQuery("select user from User user where user.userID=?1") public User findUser(int userID); }
自定义注解解析类
package learnthread.myannations; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.text.Annotation; public class AnnationsHandler implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { MyQuery query = method.getAnnotation(MyQuery.class);// 获取该方法中是否包含MyQuery注解,如果是则返回,不是则为空 String value = query.value();// 获取注解中的属性 System.out.println(value); for (Object obj : args) { System.out.println(obj);// 获取方法中的参数 } // 调用method.invoke方法会出错 // IUserService userService = (IUserService) Proxy.newProxyInstance( // IUserService.class.getClassLoader(), // new Class[] { IUserService.class }, new AnnationsHandler()); // 执行查询数据库操作 // 返回查询结果 return new User(); } }
package learnthread.myannations; import java.lang.reflect.Proxy; public class UserController { public static void main(String[] args) { IUserService userService = (IUserService) Proxy.newProxyInstance( IUserService.class.getClassLoader(), new Class[] { IUserService.class }, new AnnationsHandler()); userService.findUser(1); } }

浙公网安备 33010602011771号