1、介绍:
动态代理和静态代理的角色一样
动态代理的代理类是动态生成的,不是我们直接写好的
动态代理分为两大类:基于接口的动态代理 基于类的动态代理
·基于接口 ---- JDK动态代理(我学的是这个)
·基于类 ---- cglib
·Java字节码实现 ---- javassist
2:认识两个类 Proxy:(代理) 和 InvocationHandler:(调用处理程序)
Proxy:
Proxy
提供了创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类。
InvocationHandler:
InvocationHandler
是由代理实例的调用处理程序实现的接口 。每个代理实例都有一个关联的调用处理程序。 当在代理实例上调用方法时,方法调用将被编码并分派到其调用处理程序的
invoke
方法。
3、创建一个万用的工具类(用来创建代理角色和注入方法)
package com.li.dedmo01.dedmo2;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyInvocationHandler implements InvocationHandler {
//创建被代理的接口
private Object target;
public void setTarget(Object target) {
this.target = target;
}
//生成代理类
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),
target.getClass().getInterfaces(),this);
}
//处理代理实例,并返回结果
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(target, args);
return result;
}
}
测试接口和测试类
package com.li.dedmo01;
public interface User {
public void add();
public void delete();
public void update();
public void query();
}
package com.li.dedmo01;
//原来
public class UserImpl implements User{
@Override
public void add() {
System.out.println("增");
}
@Override
public void delete() {
System.out.println("删");
}
@Override
public void update() {
System.out.println("改");
}
@Override
public void query() {
System.out.println("查");
}
}
使用动态代理模式调用方法
package com.li.dedmo01.dedmo2;
public class TestGo {
public static void main(String[] args) {
//创建真是角色
UserImpl ht = new UserImpl();
//老方式的话这里要创建代理角色,但是这里我们没有代理角色,用前面我们写的工具类来创建代理角色
ProxyInvocationHandler pih = new ProxyInvocationHandler();
//设置要代理的类对象
pih.setTarget(ht);
//动态生成代理类
User2 proxy = (User2) pih.getProxy();
//调用方法
proxy.add();
}
}
本文含有隐藏内容,请 开通VIP 后查看