java反射和动态代理

反射

什么是反射跟反射机制?

反射就是把Java类中的各个成分映射成一个个的Java对象。

即在运行状态中:1、对于任意一个类,都能够知道这个类的所有属性和方法;

        2、对于任意一个对象,都能够调用它的任意一个属性和方法。

这种动态获取信息以及动态调用对象方法的功能叫Java的反射机制。

 

1、获取类(Class)对象

获取类对象有三种方法:

  • 通过forName() -> 示例:Class.forName(“PeopleImpl”)
  • 通过getClass() -> 示例:new PeopleImpl().getClass()
  • .class直接获取 -> 示例:PeopleImpl.class

2、类的常用方法

  • getName():获取类完整方法;
  • getSuperclass():获取类的父类;
  • newInstance():创建实例对象;
  • getFields():获取当前类和父类的public修饰的所有属性;
  • getDeclaredFields():获取当前类(不包含父类)的声明的所有属性;
  • getMethod():获取当前类和父类的public修饰的所有方法;
  • getDeclaredMethods():获取当前类(不包含父类)的声明的所有方法;

    3.类方法调用

  • 反射要调用类中的方法,需要通过关键方法“invoke()”实现的,方法调用也分为三种:

    • 静态(static)方法调用
    • 普通方法调用
    • 私有方法调用

    以下会分别演示,各种调用的实现代码,各种调用的公共代码部分,如下:

    复制代码
     1 // 此段代码为公共代码
     2 interface People {
     3     int parentAge = 18;
     4     public void sayHi(String name);
     5 }
     6 class PeopleImpl implements People {
     7     private String privSex = "男";
     8     public String race = "汉族";
     9     @Override
    10     public void sayHi(String name) {
    11         System.out.println("hello," + name);
    12     }
    13     private void prvSayHi() {
    14         System.out.println("prvSayHi~");
    15     }
    16     public static void getSex() {
    17         System.out.println("20岁");
    18     }
    19 }
    复制代码

    静态方法调用:

    public static void main(String[] args) {
        Class myClass = Class.forName("example.PeopleImpl");
        // 调用静态(static)方法
        Method getSex = myClass.getMethod("getSex");
        getSex.invoke(myClass);
    }

    使用 getMethod(xx) 获取到对应的方法,直接使用 invoke(xx)
    普通方法的调用:
    需要先获取类示例,通过“newInstance()”方法获取

    Class myClass = Class.forName("example.PeopleImpl");
    Object object = myClass.newInstance();
    Method privSayHi = myClass.getDeclaredMethod("privSayHi");
    privSayHi.setAccessible(true); // 修改访问限制
    privSayHi.invoke(object);

    动态代理
    动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制,很多场景都是利用类似机制做到的,比如用来包装 RPC 调用、面向切面的编程(AOP)。
    实现动态代理的方式很多,比如 JDK 自身提供的动态代理,就是主要利用了上面提到的反射机制。还有其他的实现方式,比如利用传说中更高性能的字节码操作机制,类似 ASM、cglib(基于 ASM)等
    首先,它是一个代理机制。如果熟悉设计模式中的代理模式,我们会知道,代理可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成。通过代理可以让调用者与实现者之间解耦。比如进行 RPC 调用,通过代理,可以提供更加友善的界面。还可以通过代理,可以做一个全局的拦截器。


posted @   梓落  阅读(182)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示