用户业务接口:
package biz;
public interface UserBiz {
public void add();
}
用户业务接口实现类:
package biz;
import annotation.Before;
public class UserBizImpl implements UserBiz {
@Before(name="记录日志方法")
public void log(){
System.out.println("UserBizImpl.log()");
}
public void add(){
System.out.println("UserBizImpl.add()");
}
}
业务方法执行前注解:
package annotation;
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 Before {
public String name() default "";
}
代理工厂类:
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import annotation.Before;
public class ProxyFactory implements InvocationHandler{
private Object target;
public Object getProxy(Object target) {
this.target = target;
Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
return proxy;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object obj = null;
System.out.println("方法前的处理");
parseBeforeMethod();
try {
obj = method.invoke(target, args);
System.out.println("方法后的处理");
} catch (Exception e) {
System.out.println("方法异常处理");
e.printStackTrace();
}finally{
System.out.println("方法的最终处理");
}
return obj;
}
private void parseBeforeMethod(){
Class<?> clazz = target.getClass();
for(Method method : clazz.getDeclaredMethods()){
Before before = method.getAnnotation(Before.class);
if(before != null){
try {
method.invoke(target);
return;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
客户端代码:
package client;
import proxy.ProxyFactory;
import biz.UserBiz;
import biz.UserBizImpl;
public class Client {
public static void main(String[] args) {
UserBiz userBiz = (UserBiz) new ProxyFactory().getProxy(new UserBizImpl());
userBiz.add();
}
}