package util;
public interface 被代理类接口 {
public void queryDataById(String Id);
public void insertData();
}
package util;
public class 被代理的类 implements 被代理类接口{
@Override
public void insertData() {
// TODO Auto-generated method stub
System.out.println("不管参数.反正插入数据了");
}
@Override
public void queryDataById(String Id) {
System.out.println("通过"+Id+"查出了数据");
}
}
package util;
public class 被代理的类2 implements 被代理类接口{
@Override
public void insertData() {
// TODO Auto-generated method stub
System.out.println("第二个
类 ,不管参数.反正插入数据了");
}
@Override
public void queryDataById(String Id) {
System.out.println("这是第二个,,通过"+Id+"查出了数据");
}
}
package util;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
/**
*
* 这个不是动态代理类!!!!!
* 主要返回代理类对象!!!!
* 通过代理类对象调用被代理的对象
*
* @author Steve
*
*/
//该类并不是代理类,只是将被代理类的对象传进这个类中,经过处理 返回代理类的对象
public class 动态代理类 {
private 被代理类接口 inter = null;
//建个构造器,将被代理的对象传进来
public 动态代理类(被代理类接口 inter) {
super();
this.inter = inter;
}
public Object getProxyObject () {
//得到classLoader
ClassLoader loader = inter.getClass().getClassLoader();
//接口数组
Class[] interfaces = {被代理类接口.class};
//去创建一个能处理该接口的AOP处理器
InvocationHandler h = new 调用处理器(inter);
//返回动态代理对象,在运行中,才知道代理哪个接口,调用哪个处理器
return Proxy.newProxyInstance(loader, interfaces, h);
}
}
package util;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//特定的处理器
public class 调用处理器 implements InvocationHandler{
//将被代理的对象传进来, 可以调用
private Object target;
public 调用处理器(Object target) {
this.target = target;
}
//这个处理器的方法,传进来的几个参数,可以想象成已知的
//proxy 是com.sun.proxy代理对象的引用.调用proxy 中的方法 不管什么方法传进来,通过动态都能使用前置和后置通知了
//代理对象会根据传进来的类,动态的代理这个类
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("我在此处使用前置通知开始执行"+method.getName()+"了..........");
Object result = method.invoke(target, args);
System.out.println("我在此处织入后置通知"+method.getName()+"执行完了........");
return result;
}
}
package util;
/**
* 采用动态代理的方式实现AOP
* @author 胡其阳
*
*/
public class Aop {
public static void main(String[] args) {
被代理类接口 b = new 被代理的类();
被代理类接口 proxy = (被代理类接口) new 动态代理类(b).getProxyObject();
proxy.queryDataById("1331");
proxy.insertData();
//System.out.println(proxy);
}
}