一些话已经在普通版写了,这里就不多说,以后学到深入了再修修改改吧。
代码实现:
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();
}
}
效果:

本文介绍了Java中动态代理的实现,通过一个简单的用户服务管理的例子展示了如何创建动态代理类。代码示例包括角色接口、真实对象的实现、动态代理类的创建以及客户端的使用。动态代理在运行时生成代理类,用于在方法调用前后添加额外的操作,如日志记录。
1431

被折叠的 条评论
为什么被折叠?



