干货小吃休闲食品代理 干货代理的流程


前言面试题:讲讲jdk动态代理,cglib区别,实现原理,优缺点,怎么实现方法的调用的
来自文章:
这篇文章总结你需要回答的知识点,全程少废话,怼干货,文章较长,可以点赞在看,喜欢这种文章的话,我之后也会一直分享的,硬核文章也会定期分享!
代理模式代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能
一个比方:在租房的时候,有的人会通过房东直租,有的人会通过中介租房 。
这两种情况哪种比较方便呢?当然是通过中介更加方便 。
这里的中介就相当于代理,用户通过中介完成租房的一系列操作(看房、交押金、租房、清扫卫生)代理模式可以有效地将具体的实现与调用方进行解耦,通过面向接口进行编码完全将具体的实现隐藏在内部 。

干货小吃休闲食品代理 干货代理的流程

文章插图

分类:
静态代理: 在编译时就已经实现,编译完成后代理类是一个实际的class文件
动态代理: 在运行时动态生成的,即编译完成后没有实际的class文件,而是在运行时动态生成类字节码,并加载到JVM中
静态代理使用方式
创建一个接口,然后创建被代理的类实现该接口并且实现该接口中的抽象方法 。之后再创建一个代理类,同时使其也实现这个接口 。在代理类中持有一个被代理对象的引用,而后在代理类方法中调用该对象的方法 。
public interface UserDao {void save();}public class UserDaoImpl implements UserDao {@Overridepublic void save() {System.out.println("正在保存用户...");}}public class TransactionHandler implements UserDao {//目标代理对象private UserDao target;//构造代理对象时传入目标对象public TransactionHandler(UserDao target) {this.target = target;}@Overridepublic void save() {//调用目标方法前的处理System.out.println("开启事务控制...");//调用目标对象的方法target.save();//调用目标方法后的处理System.out.println("关闭事务控制...");}}public class Main {public static void main(String[] args) {//新建目标对象UserDaoImpl target = new UserDaoImpl();//创建代理对象, 并使用接口对其进行引用UserDao userDao = new TransactionHandler(target);//针对接口进行调用userDao.save();}}使用JDK静态代理很容易就完成了对一个类的代理操作 。但是JDK静态代理的缺点也暴露了出来:由于代理只能为一个类服务,如果需要代理的类很多,那么就需要编写大量的代理类,比较繁琐
JDK动态代理使用JDK动态代理的五大步骤:
  1. 通过实现InvocationHandler接口来自定义自己的InvocationHandler;
  2. 通过Proxy.getProxyClass获得动态代理类;
  3. 通过反射机制获得代理类的构造方法,方法签名为getConstructor(InvocationHandler.class);
  4. 通过构造函数获得代理对象并将自定义的InvocationHandler实例对象传为参数传入;
  5. 通过代理对象调用目标方法;
public interface IHello {void sayHello();} public class HelloImpl implements IHello {@Overridepublic void sayHello() {System.out.println("Hello world!");}}import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method; public class MyInvocationHandler implements InvocationHandler {/** 目标对象 */private Object target;public MyInvocationHandler(Object target){this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("------插入前置通知代码-------------");// 执行相应的目标方法Object rs = method.invoke(target,args);System.out.println("------插入后置处理代码-------------");return rs;}}


特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。