当前位置:网站首页 > Java基础 > 正文

java反射代理教程



一般情况下,需要一个功能的前提是遇到了某个问题,这里先列举一些问题,然后再通过反射是如何解决了这些问题,来引出反射的定义。

普通开发人员工作中最常见的问题:需要生成代理对象(不清楚代理模式的话,可以简单理解为需要将一个类,在不改变这个类的代码的基础上,要对这个类的功能添加新的逻辑)

解决方式:将需要加强的类,利用反射加载之后,与补充的逻辑进行融合,产生一个新的对象,这个对象就是代理对象,即具备原有类及新逻辑的“增强后的类”(比如 Man 类里面有个 eat() 方法,我们希望执行 eat() 方法前后分别执行洗手、洗碗逻辑,而我们又不能直接去修改eat()方法)

上面是用简洁的方式给出了关于反射的最直白的解释,下面给出较为专业、全面的解释:

反射(Reflection)是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。

通过反射机制,可以在运行时访问 Java 对象的属性,方法,构造方法等

反射的应用场景:

为了理解下一节反射与代理的关系,这里先介绍一下会涉及到的术语:

真实对象(被代理对象):就是最原始的类实例化产生的对象,未经过代理模式对其加工增强,比如上面所说的Man类的对象

代理对象:利用代理模式增强后的对象,比如SuperMan对象

动态代理类:可以理解为代理对象逻辑处理器,也可以理解为“增强”的逻辑所处的位置,需要传入真实对象产生关联的动态代理对象

InvocationHandler 接口:动态代理类需要实现这个接口,并且重写 invoke() 方法,“增强”的逻辑就写在invoke方法里,每个代理类的实例都关联到了一个 Handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由 InvocationHandler 这个接口的 invoke 方法来进行调用

Proxy:代理类,用以为将动态代理对象传入之后,产生真正代理对象

如上所述,代理模式的主要作用产生代理对象从而实现增强后的方法,而反射作为 Java 所提供的一个特性,是实现代理模式的基础。换言之,利用反射技术获取和操作Java程序里面的类,从而可以对这些类进行包装及加工,产生出代理对象。

获得实现类对象的代理对象:

3.获得代理对象的类对象(这里我们可以打印一下代理类的类对象的类名)

4.获得代理类的所有方法(通过暴力反射 getDeclaredMethods()获得)(将所有获得的方法遍历,输出所有的方法名)

之后会执行接口独有的invoked()方法,传入两个参数,分别是真实的实现类对象和传入的参数args,最后返回方法。

Java里面提供了反射获取类的各个属性及方法的类,但是前提是拿到该类之后才能获取并进行相应的操作,而反射框架Reflections不但能获取classpath下面的类,还能根据特定的注解进行获取。

Reflections通过扫描classpath,索引元数据,并且允许在运行时查询这些元数据。

使用Reflections可以很轻松的获取以下元数据信息:

  1. 获取某个类型的全部子类
  2. 只要类型、构造器、方法,字段上带有特定注解,便能获取带有这个注解的全部信息(类型、构造器、方法,字段)
  3. 获取所有能匹配某个正则表达式的资源
  4. 获取所有带有特定签名的方法,包括参数,参数注解,返回类型
  5. 获取所有方法的名字
  6. 获取代码里所有字段、方法名、构造器的使用

  • 上一篇: java hadoop 教程
  • 下一篇: 363集java教程
  • 版权声明


    相关文章:

  • java hadoop 教程2025-12-03 10:26:04
  • java迷你dvd教程2025-12-03 10:26:04
  • 安徽java教程咨询2025-12-03 10:26:04
  • java的数学知识教程2025-12-03 10:26:04
  • java无人机开发教程2025-12-03 10:26:04
  • 363集java教程2025-12-03 10:26:04
  • java实战教程视频2025-12-03 10:26:04
  • java接口编程教程2025-12-03 10:26:04
  • 微信开发教程java2025-12-03 10:26:04
  • java导入项目教程2025-12-03 10:26:04