java 静态代理和动态代理

it2024-10-29  14

一、动态代理

1.1 参考

https://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html

二、静态代理

2.1 接口

public interface Stu { public void getName(); public void getAge(); }

2.2 接口的实现

public class StuImp implements Stu{ @Override public void getName() { System.out.println("获得姓名"); } @Override public void getAge() { System.out.println("获得年龄"); } }

2.3 静态代理

public class StuDelget { StuImp stu; public StuDelget(StuImp stu){ this.stu = stu; } public void getName(){ System.out.println("代理前的操作"); stu.getName(); System.out.println("代理后的操作"); } public void getAge(){ System.out.println("代理前的操作"); stu.getAge(); System.out.println("代理后的操作"); } }

2.4 测试类

public class test { public static void main(String[] args) { StuImp stuImp = new StuImp(); StuDelget stuDelget = new StuDelget(stuImp); stuDelget.getName(); stuDelget.getAge(); } }

三、JDK动态代理

3.1 接口

public interface Stu { public void show(); public void trash(); }

3.2 接口的实类

public class StuImp implements Stu{ @Override public void show() { System.out.println("获得姓名"); } @Override public void trash() { System.out.println("获得年龄"); } }

3.3 动态代理

实现InvocationHandler类返回任意对象的代理类重写invoke方法(代理的主要工作) public class StuProxy implements InvocationHandler { Object target; /** * 绑定委托对象并返回一个代理类 * @param target * @return */ public Object bind(Object target){ this.target = target; return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object invoke = null; System.out.println("代理前的一些操作"); invoke = method.invoke(target, args); System.out.println("代理后端一些操作"); return invoke; } }

3.4 动态代理测试

传入一个实现接口的实现类一定是实现类来调用需要代理的方法的 public class test1 { public static void main(String[] args) { StuProxy stuProxy = new StuProxy(); Stu bind = (Stu) stuProxy.bind(new StuImp()); bind.show(); } }

3.5 JDK动态代理不足

只能代理实现了接口的实现类,对没有实现接口的实现类不能代理。

四、Cglib动态代理

4.1 原理

针对未实现接口的类进行代理,需要一个继承该类的子类,来覆盖其方法实现增强。

4.2 接口

public interface Cgstu { public void show(); public void doSth(); }

4.3 实现类

public class CgStuImp implements Cgstu { @Override public void show() { System.out.println("show方法"); } @Override public void doSth() { System.out.println("dosth方法"); } }

4.4 Cglib动态代理

public class StucgLib implements MethodInterceptor { Object target; public Object getInstance(Object target) { this.target = target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.target.getClass()); // 回调方法 enhancer.setCallback((Callback) this); // 创建代理对象 return enhancer.create(); } @Override // 回调方法 public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("事物开始"); proxy.invokeSuper(obj, args); System.out.println("事物结束"); return null; } }

4.5 测试

public class test2 { public static void main(String[] args) { CgStuImp cgStuImp = new CgStuImp(); StucgLib stucgLib = new StucgLib(); CgStuImp instance = (CgStuImp) stucgLib.getInstance(cgStuImp); instance.show(); } }

4.6 参考

https://blog.csdn.net/fanrenxiang/article/details/81939357

最新回复(0)