代理有三种:静态代理、动态代理、cglib代理
一 .静态代理
在运行前就已经产生了代理的类字节码
-
委托类
public interface Fruit { void getName(); void getColor(); } public class Apple implements Fruit{ @Override public void getName() { System.out.print("苹果"); } @Override public void getColor() { System.out.println("红色"); }
- 代理类
public class ProxyUtils { private Fruit mFruit; public ProxyUtils(Fruit fruit) { mFruit = fruit; } public void getName(){ mFruit.getName(); } public void getColor(){ mFruit.getColor(); } }
-
优点
可以在不修改委托类的情况下添加委托类的功能
-
缺点
当接口增加方法,代理类和委托类都要添加方法
二.动态代理
在运行期才会生成代理类的字节码文件。且委托类必须实现接口。
newProxyInstance三个参数:
- 类加载器;
- 委托类实现接口的类型
- 事件处理器
Fruit fruit = new Apple(); Fruit fruit1 = (Fruit) Proxy.newProxyInstance(fruit.getClass().getClassLoader(), fruit.getClass.getInterfaces(),new MyHandler(fruit));
class MyHandler implements InvocationHandler{ private Object mObject;//委托类对象 public MyHandler(Object object) { mObject = object; } /** * @param proxy 代理类的对象 * @param method 待调用的方法 * @param args 方法参数 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(mObject.getClass().getName()); System.out.println(proxy.getClass().getName()); return method.invoke(mObject,args); }
打印结果
Apple
com.sun.proxy.$Proxy0
苹果