动态代理机制是Spring AOP编程的原理基础。
JDK的动态代理机制有个限制就是它只能代理实现了一个或多个接口的类。如PersonImpl得实现Person接口,才能用JDK动态代理机制。
定义一个Person的接口:
package wang.dao; public interface Person { public void eat(); public void sleep(); }
定义接口Person的实现类,类的实例就是我们要代理的对象(被代理的对象)
package wang.dao.impl; import wang.dao.Person; public class PersonImpl implements Person{ @Override public void eat() { System.out.println("吃的方法。。。"); } @Override public void sleep() { System.out.println("睡的方法。。。"); } }
定义代理处理类。其中主要有以下几点。
1.实现InvocationHandler接口。
2.定义被代理的对象;
3.定义一个方法,将被代理的对象和处理器的实例(this)关联;
4.调用被代理对象的方法。
package wang.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.sun.org.apache.bcel.internal.generic.ReturnaddressType;
public class MyProxy implements InvocationHandler {
//2.定义被代理的对象
private Object person;
//3.定义一个方法,将被代理的对象和处理器实例(this)关联。
public Object bind(Object person)
{
this.person = person;
return Proxy.newProxyInstance(this.getClass().getClassLoader(), person.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理前");
//4.调用被代理对象的方法。
method.invoke(person, args);
System.out.println("代理后");
return null;
}
}
package wang.test; import wang.dao.Person; import wang.dao.impl.PersonImpl; import wang.proxy.MyProxy; public class ProxyTest { /** * @param args */ public static void main(String[] args) { Person person = new PersonImpl();//被代理的对象 MyProxy proxy = new MyProxy(); person = (Person) proxy.bind(person);// person.eat(); person.sleep(); } }