动态代理模式:
<1>`代理接口
package dao;
public interface Service {
public void add();
public void delete();
public void update();
public void search();
}
<2>被代理类
package dao;
public class UserService implements Service {
public void add() {
System.out.println("add");
}
public void delete() {
System.out.println("delete");
}
public void update() {
System.out.println("update");
}
public void search() {
System.out.println("search");
}
}
<3>动态代理类
package dao;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyInvacationHandler implements InvocationHandler {
private Object target;
public void setTarget(Object target) {
this.target = target;
}
//获取代理类
public Object getProxy(){
/*
参数1:this本类对象,getClass获取本来的Class对象,getClassLoader获取该Class对象的类加载器
参数2:获得被代理对象的接口
参数3:本类对象
*/
return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(),this);
}
//代理执行附加处理
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/*
动态调用被代理类对象中的方法
参数1:被代理类对象
参数2:固定为args
如果要添加附加方法,若在源方法之前附加,在下面这行代码前边附加。
若要在后边,则在此行代码后边附加即可。
*/
Object result = method.invoke(target,args);
return result;
}
}
<4>测试类
package dao;
public class test {
public static void main(String[] args) {
//被代理的对象
UserService userService = new UserService();
//动态代理类
ProxyInvacationHandler pro = new ProxyInvacationHandler();
//设置被代理的对象
pro.setTarget(userService);
//生成一个代理类
Service proxy = (Service) pro.getProxy();
proxy.add();
}
}