1,静态代理,需要创建两个类实现同一接口,
package com.day2; public class Test { public static void main(String[] args) { // 静态代理.代理类和被代理类必须实现同一接口,代理类中需要通过构造函数传入被代理对象(接口对象) // new Met();被代理对象; // new Mete()代理对象; new Mete(new Met()).add(); } } interface Jis{ void add(); } class Met implements Jis{ @Override public void add() { System.out.println("加法"); } } class Mete implements Jis{ private Jis jis; public Mete (Jis jis){ this.jis=jis; } @Override public void add() { System.out.println("计算前"); jis.add(); System.out.println("计算后"); } }
优点;逻辑简单,
缺点;每次代理都需要创建一个代理类实现接口,导致代码冗长,编译时会生成class文件.
2.动态代理;编译时不会生成字节码文件,运行时生成class文件,动态生成代理对象与被代理对象,
package com.day1; import java.lang.reflect.Proxy; interface Jis{ void add(); void delete(); void select(); void update(); } class Met implements Jis{ @Override public void add() { System.out.println("添加"); } @Override public void delete() { System.out.println("修改"); } @Override public void select() { System.out.println("查询"); } @Override public void update() { System.out.println("删除"); } } public class Test { private static Object InvocationHandler; public static void main(String[] args) { Met met = new Met(); met.add(); met.delete(); met.select(); met.update(); Mete2 handler=new Mete2(met); Jis proxyInstance= (Jis) Proxy.newProxyInstance( met.getClass().getClassLoader(), met.getClass().getInterfaces(), handler); proxyInstance.add(); proxyInstance.delete(); proxyInstance.update(); proxyInstance.select(); } }
package com.day1; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /Mete2实现InvocationHander接口; public class Mete2 implements InvocationHandler{ /任何类的对象都可以作为Object对象. private Object target; public Mete2(Object target){ this.target=target; } /重写invoke方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("校验"); Object obj = method.invoke(target, args); System.out.println("产生结果"); return obj; } }
优点;动态生成代理类对象,编译时不会生成class文件.代理,让别的类帮忙执行相同的代码.将所有的代理对象封装到一个类中,其中有invoke方法实现.