零基础Java:第二十一讲(通过反射调用类中的指定方法和指定属性、Java动态代理)

126 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

通过反射调用类中的指定方法、指定属性

  • 三、通过反射调用类中的指定方法、指定属性

    • 调用指定方法

      • 通过反射,调用类中的方法,通过Method类完成。步骤:

        • 通过Class类的getMethod(String name,Class...parameterTypes)方法取得一个Method对象,并设置此方法操作时所需要的参数类型(...代表参数是0到多个)。
        • 之后使用Object invoke(Object obj,Object[] args)进行调用,并向方法中传递要设置的obj对象的参数信息。
      • 举例

        • 前提:通过无参构造创建对象
        • 想要调用一个公有方法
        • 想要调用一个私有方法
        • 调用一个重载方法
        • 调用有返回值的方法
    • 调用指定属性

      • 在反射机制中,可以直接通过Field类操作类中的属性,通过Field了提供的set()和get()方法就可以完成设置和取得属性内容的操作
      • public Field getField(String name);返回此Class对象表示的类或接口指定的public的Field
      • public Field getDeclaredField(String name);返回此Class对象表示的类或接口的指定的Field
      • 在Field中的方法

        • public Object get(Object obj);取得指定对象obj上此Field的属性内容
        • public void set(Object obj,Object value);设置指定对象obj上此Field的属性内容
        • public void setAccessible(true);访问私有属性时,让这个属性可见
        • 注:在类中属性都设置为private的前提下,在使用set()和get()方法时,首先要使用Field类中的setAccessible(true)方法将需要操作的属性设置为可以被外部访问
      • 举例

        • 通过构造方法创建对象
        • 访问公有属性
        • 访问私有属性
        • 结果输出

Java动态代理

  • Java动态代理

    • Proxy:专门完成代理的操作类,是所有动态代理类的父类。通过此类为一个或多个接口动态地生成实现类
    • 创建一个动态代理类所对应的Class对象:static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)直接创建一个动态代理对象
    • 举例:一个java项目,其中有100个java类,每个java有10个方法,这总共1000个方法。现在有这样一个需求,需要在每个java方法上加上2句话,在方法执行前输出这个方法开始执行,在方法执行后输出这个方法已经完成。
    • 举例:

      • 第一步:创建一个ITestDemo接口
      • 第二步:创建一个TestDemoImpl类实现接口
      • 第三步:创建一个ProxyDemo动态代理类
      • 第四步:创建test2测试类
      • 第五步:结果输出
    • 注意:

      • 如果一个对象想要通过Proxy.newProxyInstance方法被代理,那么这个对象的类一定要有相应的接口,就像本例中的ITestDemo接口和实现类TestDemoImpl
      • Proxy.newProxyInstance(ClassLoader, interfaces, h); 参数1是代理对象的类加载器,参数2是被代理对象的接口,参数3是代理对象,返回的值就是成功被代理后的对象,返回的是object类型,需要根据情况转换类型。