系列文章目录
第一篇:设计模式之观察者模式
第二篇:设计模式之代理模式
第三篇:设计模式之责任链模式
第四篇:设计模式之建造者模式
前言
主要解决:在直接访问对象时带来的问题
何时使用:想在访问一个类时做一些控制,或者想要为类中的某个方法添加新的功能
提示:以下是本篇文章正文内容,下面案例可供参考
一、静态代理
// 代理接口
public interface Users {
public void addUser();
}
// 实现类
class UserInfo implements Users{
public void addUser() {
System.out.println("添加用户");
}
}
//代理类
class UserProxyImpl implements Users{
//通过代理接口属性注入
private Users users;
// 通过构造方法传入代理对象
public UserProxyImpl(Users users) {
this.users = users;
}
// 实现代理方法
public void addUser() {
System.out.println("开始添加用户。。。");
// 代理方法一般只做增强,不做修改,原来的逻辑不动
users.addUser();// 调用原来的方法
System.out.println("添加成功。。。");
}
public static void main(String[] args) {
Users users=new UserProxyImpl(new UserInfo());
users.addUser();
}
}
二、动态代理
1.1 Jdk 代理
// 代理接口
public interface Color {
void scribble();
}
// 代理接口实现类
public class Green implements Color{
@Override
public void scribble() { System.out.println("绿色"); }
}
// 代理类
public class ColorProxy implements InvocationHandler {
private Color color;
public ColorProxy(Color color) {
this.color = color;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 此处可以实现自己的逻辑
return method.invoke(color,args);
}
public <T> T getProxy() {
return (T) Proxy.newProxyInstance(color.getClass().getClassLoader(),color.getClass().getInterfaces(),this);
}
public static void main(String[] args) {
// 调用代理类实现增强
Color green = new ColorProxy(new Green()).getProxy();
green.scribble();
}
}
1.2 Cglib 代理
// 代理类
class Hello1 {
public String hello() {
System.out.println("excute hello method");
return "hello cglib";
}
}
// 实现MethodInterceptor 接口
public class CglibDemo implements MethodInterceptor {
public static Object getTarget(Object object){
Enhancer enchaner = new Enhancer();
enchaner.setSuperclass(Hello1.class);
enchaner.setCallback(this);
return enchaner.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
return methodProxy.invokeSuper(o, objects);
}
public static void main(String[] args) {
Hello1 target = (Hello1) new CglibDemo().getTarget();
System.out.println(target.hello());
}
}
总结
后话,想要深入了解Jdk代理需要去了解Java asm框架
ASM是一个通用的 Java 字节码操作和分析框架。它可用于直接以二进制形式修改现有类或动态生成类。ASM 提供了一些常见的字节码转换和分析算法,可以从中构建自定义的复杂转换和代码分析工具。ASM 提供与其他 Java 字节码框架类似的功能,但侧重于 性能。因为它被设计和实现为尽可能小和尽可能快,所以它非常适合在动态系统中使用(当然也可以以静态方式使用,例如在编译器中)
Asm 官方网址 :https://asm.ow2.io/index.html