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);
    }

}

 

posted @ 2016-03-10 14:12  程序猿进化之路  阅读(267)  评论(0)    收藏  举报