一 动态代理
动态代理是指客户通过代理类来调用其它对象的方法,并且是在程序运行时根据需要动态创建目标类的代理对象,下面直接看代码:
二 测试
Animal.java
package com.lxj.dynamic.proxy;
public interface Animal {
public void action();
public void breath();
}
Cat.java
package com.lxj.dynamic.proxy;
//被代理类Cat
public class Cat implements Animal {
@Override
public void action() {
System.out.println("喵喵喵~~~~");
}
@Override
public void breath() {
System.out.println("猫式呼吸法~~~~");
}
}
Dog.java
package com.lxj.dynamic.proxy;
//被代理类 Dog
public class Dog implements Animal {
@Override
public void action() {
System.out.println("汪汪汪~~~~~");
}
@Override
public void breath() {
System.out.println("狗式呼吸法~~~~");
}
}
MyProxy.java
package com.lxj.dynamic.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//代理类MyProxy,动态代理需要实现InvocationHandler接口
public class MyProxy implements InvocationHandler{
Object obj;
public MyProxy() {}
public void setObj(Object obj) {
this.obj = obj;
}
//代理类调用方法时,都会调用invoke方法
//method:代理对象执行的方法
//args:参数
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("==============代理类开始执行!!!!=============");
//returnVal是方法的返回值
Object returnVal = method.invoke(obj, args);
System.out.println("==============代理类执行结束!!!!=============");
return returnVal;
}
}
ProxyUtil.java
package com.lxj.dynamic.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class ProxyUtil {
public static Object getProxyInstance(Object obj) {
MyProxy proxy = new MyProxy();
proxy.setObj(obj);
/*
* obj.getClass().getClassLoader():被代理对象的类加载器
* obj.getClass().getInterfaces() :被代理对象的接口
* 实质上是通过反射将被代理类的加载器和接口与代理对象关联起来
* obj :是被代理的对象
* proxy:实现InvocationHandler的接口
*/
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), proxy);
}
}
TestDynamicProxy.java
package com.lxj.dynamic.proxy;
public class TestDynamicProxy {
public static void main(String[] args) {
Cat cat = new Cat();
Object proxyInstance = ProxyUtil.getProxyInstance(cat);
Animal animal = (Animal) proxyInstance;
animal.action();
animal.breath();
Dog dog = new Dog();
proxyInstance = ProxyUtil.getProxyInstance(dog);
animal = (Animal) proxyInstance;
animal.action();
animal.breath();
}
}
三 运行结果
动态代理的代理对象是在运行时动态创建目标类的代理对象,而静态代理是需要为每个目标类创建代理对象,动态代理只需要一个方法就可以,相比静态代理代码冗余量减少了。