一些话已经在普通版写了,这里就不多说,以后学到深入了再修修改改吧。
代码实现:
1、角色接口
package com.qi.demo02;
//抽象角色接口
public interface UserService {
public void add();
public void delete();
public void update();
public void query();
}
2、真实的对象
package com.qi.demo02;
//真实的对象 去实现抽象角色接口
public class UserServiceImpl implements UserService{
public void add() {
System.out.println("增加了一个用户!");
}
public void delete() {
System.out.println("删除了一个用户!");
}
public void update() {
System.out.println("修改了一个用户!");
}
public void query() {
System.out.println("查询了一个用户!");
}
}
3、动态代理类(有工具类的思想)
package com.qi.demo04;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//改改后变活了,工具类的思路:代理谁 + 生成代理类 + 调用代理程序的执行方法
//等会我们用这个类,自动生成代理类!
public class ProxyInvocationHandler implements InvocationHandler {
//被代理的接口
private Object target; //改成 Object target
public void setTarget(Object target) {
this.target = target;
}
//生成得到代理类
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
//处理代理实例。并返回结果!
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//动态代理的本质:就是使用反射机制实现的!
log(method.getName());
Object result = method.invoke(target, args);
return result;
}
public void log(String msg){
System.out.println("【DeBug】执行了"+msg+"方法");
}
}
4、客户
package com.qi.demo04;
import com.qi.demo02.UserService;
import com.qi.demo02.UserServiceImpl;
public class Client {
public static void main(String[] args) {
//真实角色
UserServiceImpl userService = new UserServiceImpl();
//代理角色:不存在
ProxyInvocationHandler pih = new ProxyInvocationHandler();
pih.setTarget(userService); //设置要代理的对象
//动态生成代理类
UserService proxy = (UserService) pih.getProxy();
proxy.query();
proxy.add();
proxy.delete();
proxy.update();
}
}
效果: