动态代理和静态代理角色一样 需要有 真实角色、代理角色、抽象角色
动态代理的代理类是动态生成的不是我我们直接生成的
动态代理分为两大类:基于接口的动态代理 、基于类的动态代理
1基于接口---JDK动态代理【这里使用】
2基于类--cglib
3Java 字节码实现
需要了解两个类, Proxy(代理) ,invocationHandler (调用处理程序)
一、抽象角色
package xl.demo; /** * @author xulei * @version 1.0 * @date 2020/11/15 14:49 */ public interface Test { String bark(); String eat(); }
二、真实角色
package xl.demo; /** * @author xulei * @version 1.0 * @date 2020/11/15 14:56 */ public class TestImpl implements Test { @Override public String bark() { System.out.println("bark"); return null; } @Override public String eat() { System.out.println("eat"); return null; } }
三、代理角色
package xl.demo;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author xulei
* @version 1.0
* @date 2020/11/15 14:50
*/
public class TestProxy implements InvocationHandler {
Object target;
public TestProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("调用之前");
Object invoke = method.invoke(target, args);
System.out.println("调用之后");
return invoke;
}
//获取实例对象
public Object getProxyInstance() {
Object o = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
return o;
}
}
四、调用接口
package xl.demo; import java.lang.reflect.Proxy; /** * @author xulei * @version 1.0 * @date 2020/11/15 14:55 */ public class Client { public static void main(String[] args) { //真实角色 TestImpl test = new TestImpl(); //代理角色 TestProxy testProxy = new TestProxy(test);
//抽象角色,本条语句可以封装到代理角色中 Test o = (Test) Proxy.newProxyInstance(test.getClass().getClassLoader(), test.getClass().getInterfaces(), testProxy);
//Test 0 = (Test)testProxy.getProxyInstance(); o.bark(); o.eat(); } }