实现动态代理的两种方式:
第一种是JDK提供的基于接口的动态代理,要求被代理的类必须至少实现一个接口。
2.
第二种是第三方cglib提供的基于子类的动态代理,。至少要继承一个类。
我们这里 来讲解,动态代理,以及第一种实现动态代理的方式
首先最最最最重要
动态代理的作用就是
1.在不改变原来对象的代码上,对该对象进行增强。
2.业务层的对象只需要考虑业务逻辑,而不必考虑其他的逻辑。
也可以理解为,代理的作用就是一个过滤器。它可以在方法执行前和执行后,做出其他的动作,以往的方式的,直接在方法前加上需要进行的动作,和方法后加上需要进行的动作。这样我们可以发现,方法的业务逻辑和动作的业务逻辑显示是不同的,如果修改了方法,还要保证没有破坏到动作内容的代码。动态代理就是讲这两层的代码分开。降低代码的耦合度。
JDK实现动态代理的原理
通过创建代理类,来实现代理。代理类中实现动作的代码,调用实现了接口类的实现类的方法。以将两个不同的逻辑分开。
JDK实现动态代理的步骤
- 创建代理类
- 获取代理对象
- 使用代理对象
创建代理类的步骤 - 初始化需要代理的对象
- 处理需要代理的对象,并返回
处理代理对象(mathImp为例)
全代码展示
类:
类mathImp
public class mathImp implements mathInter{
@Override
public int add(int a, int b) {
return a+b;
}
@Override
public int sub(int a, int b) {
return a-b;
}
}
类mathInter
public interface mathInter {
public int add(int a,int b) ;
public int sub(int a,int b) ;
}
类proxyDemo
public class proxyDemo {
//需要代理的对象
private mathImp mathImp;
public proxyDemo(proxy.mathImp mathImp) {
super();
this.mathImp = mathImp;
}
//返回代理对象
public Object getproxy() {
//获取类加载器
ClassLoader loader=this.getClass().getClassLoader();
//获取代理类实现的接口
Class<?>[] interfaces=mathImp.getClass().getInterfaces();
return Proxy.newProxyInstance(loader, interfaces, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName()+Arrays.toString(args));
Object result=method.invoke(mathImp, args);
System.out.println(method.getName()+Arrays.toString(args)+"="+result);
return result;
}
});
}
}
类test
public class test {
public static void main(String[] args) {
//创建代理类
proxyDemo proxy=new proxyDemo(new mathImp());
//获取代理对象
mathInter mathInter= (proxy.mathInter) proxy.getproxy();
int sum=mathInter.add(3, 4);
System.out.println(sum);
}
}