基于动态代理的AOP编程
直接code吧,这个看不懂的就是java动态代理还不够扎实,可以去看看先再来弄这个
- 首先写接口(必须的)也是代理对象,StudentDAO.java:
package DyAOP;
public interface StudentDAO {
public void AttendClass();
}
2.实现接口和重写其方法,StudentImpl.java:
package DyAOP;
public class StudentImpl implements StudentDAO {
@Override
public void AttendClass() {
// TODO Auto-generated method stub
System.out.print("学生上课");
}
}
3.代理类,里面有具体增强的方法,MyInvocationHander.java:
package DyAOP;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHander implements InvocationHandler {
//目标对象传进来
Object obj;
public MyInvocationHander(Object obj) {
super();
this.obj = obj;
}
/*
* 第一个指被代理的对象
* 目标对象需要执行的方法,jdk会传过来
* 这个方法的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
System.out.println("老师来了,准备上课");//前置增强
//执行目标方法
method.invoke(obj, args);
return null;
}
}
4.最好测试类,Classroom.java:
package DyAOP;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Classroom {
public static void main(String[] args) {
// TODO Auto-generated method stub
//目标对象
StudentDAO stu=new StudentImpl();
//jdk进行动态代理,对目标方法进行加强
/*三个参数的意思
* 1)类加载器
* 2)目标对象实现的接口
* 3)实现InvocationHander接口的对象
*/
InvocationHandler h=new MyInvocationHander(stu);
//创建代理对象
Object newPro= Proxy.newProxyInstance(stu.getClass().getClassLoader(),stu.getClass().getInterfaces(), h);
//执行代理对象方法
StudentDAO proxy=(StudentDAO)newPro;//代理对象是studentDao,就要转成这个类型
proxy.AttendClass();
}
}
运行如下: