• 动态代理和静态代理角色一样
  • 动态代理的代理类是动态生成的
  • 动态代理分为两大类:基于接口和基于类
  • 基于接口的:JDK动态代理
  • 基于类: cglib
  • java字节码:javasist

需要了解两个类: Proxy 代理, InvocationHandler 调用处理程序

动态代理的好处:

  • 一个动态代理的是一个接口,一般就是对应的一类业务
  • 一个动态代理类可以代理多个类

1.建立一个接口

package com.shao.demo04;

public interface UserService {
public void add();
public void delete();
public void update();
public void query();
}

2.接口的实现类

package com.shao.demo04;

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.shao.demo04;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class UserServiceProxy implements InvocationHandler {
//被代理的接口
private UserService userService;
//生成接口实现的对象
public void setUserService(UserService userService) {
this.userService = userService;
}
//生成代理对象
public Object getProxy(){
//参数分别是类加载器,代理类的接口,第三个是InvocationHandler
return Proxy.newProxyInstance(
this.getClass().getClassLoader(),
userService.getClass().getInterfaces(),
this);
}
//处理代理实例并返回结果
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//执行代理上面的方法。动态代理的本质
log(method.getName());
Object result = method.invoke(userService, args);
return result;
}
public void log(String msg){
System.out.println("使用了"+msg+"方法");
}

}

4.测试

package com.shao.demo04;

public class Client {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
UserServiceProxy handler = new UserServiceProxy();
handler.setUserService(userService);
UserService proxy = (UserService) handler.getProxy();
proxy.add();
}
}

主要是给自己看的,所以肯定会出现很多错误哈哈哈哈哈