通过一个例子简单实现动态代理:给增删改查操作增加日志功能
(1)创建增删改查操作的接口
public interface IFunction {
void select();
void insert();
void update();
void delete();
}
(2)创建增删改查操作的实现类
public class Function implements IFunction{
@Override
public void select() {
running("select");
}
@Override
public void insert() {
running("insert");
}
@Override
public void update() {
running("update");
}
@Override
public void delete() {
running("delete");
}
private void running(String doWhat){
System.out.println(doWhat + "is running");
}
}
(3)创建InvocationHandler实现类
public class CreateHandler implements InvocationHandler {
private IFunction iFunction;
public CreateHandler(IFunction iFunction){
this.iFunction = iFunction;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("操作开始运行,操作类型是:"+method.getName());
Object res = method.invoke(iFunction, args);
System.out.println(method.getName()+"运行结束");
System.out.println();
return res;
}
}
(4)Service类调用增删改查操作
public class Service {
public static void main(String[] args) {
CreateHandler handler = new CreateHandler(new Function());
IFunction o = (IFunction)Proxy.newProxyInstance(handler.getClass().getClassLoader(),Function.class.getInterfaces(),handler);
o.insert();
o.select();
o.update();
o.delete();
}
}
输出结果:
操作开始运行,操作类型是:insert
insertis running
insert运行结束
操作开始运行,操作类型是:select
selectis running
select运行结束
操作开始运行,操作类型是:update
updateis running
update运行结束
操作开始运行,操作类型是:delete
deleteis running
delete运行结束
注意:被代理对象必须实现接口
newProxyInstance()方法包括三个参数:
(1)ClassLoader:类加载器(随便哪个类的类加载器都行。。。本质上是一样的)
IFunction.class.getClassLoader();
Function.class.getClassLoader();
CreateHandler.class.getClassLoader();
//类加载器都是AppClassLoader
(2)Class<?>[]:被代理对象实现的接口
(3)InvocationHandler:InvocationHandler的实现类