动态代理
简介:
Java中动态代理应用广泛,例如Spring 的AOP思想: 将通用的横切面 插入到 业务逻辑中就用到了动态代理(eg:日志打印)。
实现方式:
1.实现InvokeHandler接口,在其中的Invoke方法中对被代理对象的方法添加增强行为。
被代理类:
// 接口用于声明代理可以增强那些方法
public interface People {
public void say();
public void run();
}
//被代理类
public class ChinesePeople implements People{
@Override
public void say() {
System.out.println("Chinese people say");
}
@Override
public void run() {
System.out.println("Chinese people run");
}
}
增强处理:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class PeopleInvokeHandler implements InvocationHandler {
private People people;
/**
* 创建时可以传入被代理的类
* @param people
*/
public PeopleInvokeHandler(People people){
this.people = people;
}
/**
* 中途也可以换代理的对象
* @param people
*/
public void setPeople(People people){
this.people = people;
}
/**
* 在被代理的对象执行之前或者之后添加一些行为
* @param proxy
* @param method
* @param args
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//代理前 ,这里可以做一些日志打印之类的工作
System.out.println(" before proxy invoke ");
//执行被代理的方法
method.invoke(people,args);
//代理后 ,也可以做一些日志打印的工作
System.out.println("after proxu invoke ");
return null;
}
}
2.通过Proxy类创建出原有被代理对象的代理对象,并调用其增强后的方法
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Client {
public static void main(String s []){
//被代理对象
People people = new ChinesePeople();
InvocationHandler handler = new PeopleInvokeHandler(people);
/**
* 创建代理对象
* 1.类加载器
* 2.要代理的接口 只会代理此接口声明的方法
* 3.代理方法增强处理handler
*/
People proxyPeople = (People) Proxy.newProxyInstance(handler.getClass().getClassLoader(),people.getClass().getInterfaces(),handler);
//由此后proxyPeople执行原有被代理(people)的方法,将会被添加一些前置或者后置行为
proxyPeople.run();
proxyPeople.say();
}
}
执行结果:
before proxy invoke
Chinese people run
after proxu invoke
before proxy invoke
Chinese people say
after proxu invoke