zoukankan      html  css  js  c++  java
  • Java进阶之反射

    一、反射的基本概念

    反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作, 也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们。

    1.Class类
      1) 在面向对象的世界里,万事万物皆对象。(java语言中,静态的成员、普通数据类型除外)
       类是不是对象呢?类是(哪个类的对象呢?)谁的对象呢?
       类是对象,类是java.lang.Class类的实例对象
      2)这个对象到底如何表示
      3 )Class.forName("类的全称")
           不仅表示了,类的类类型,还代表了动态加载类
           请大家区分编译、运行
           编译时刻加载类是静态加载类、运行时刻加载类是动态加载类
      4)基本的数据类型
          void关键字  都存在类类型
      5)Class类的基本API操作
      
    2.方法的反射
    1)如何获取某个方法
        方法的名称和方法的参数列表才能唯一决定某个方法
    2)方法反射的操作
       method.invoke(对象,参数列表)
    3)为什么要用方法的反射
        why?指定方法名称调用方法
        举个实际应用的案例  ---->通过标准JavaBean的属性名获取其属性值
        BeanUtil类
    4)通过Class,Method来认识泛型的本质 

    一个例子:

    public class ClassDemo1 {
        public static void main(String[] args) {
            Foo foo1 = new Foo();
            //任何一个类都是Class的实例对象
            //有三种表达方式
            Class c1 = Foo.class;
            Class c2 = foo1.getClass();
            try {
                Class c3 = Class.forName("com.brianway.learning.java.base.reflector.Foo");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            //c1 c2表示了Foo类的类类型
            //万事万物皆对象,类也是对象,类是Class类的实例对象,这个对象称之为该类的类类型
            System.out.println(c1 == c2);
            //完全可以通过类的类类型创建该类的实例对象=>即可以通过c1 or c2 or c3创建Foo的实例对象
            try {
                Foo foo = (Foo)c1.newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            System.out.println(foo1.getClass());
        }
    }

    想要获得一个类的信息,那么应该先获得类的类类型,得到了类类型,类的所有信息都能轻而易举的得到了

    二、反射的应用

    1. 一个情形:

    New 创建对象,是静态加载类,在编译时刻就需要加载所有可能用到的类

    但是我们希望能在运行时刻再决定需要用哪个类,即类的动态加载
     功能型的类应该都实现动态加载,以防止一个类出现问题了,其他的类不会出现问题。 
     
     
    2.具体应用:

    SpringBoot中的依赖注入:spring会先将应用里的类都注册了,然后要具体用的时候再用反射得到类信息 => 反射的优点:运行期类型的判断,动态类加载, 解耦以及提高代码的灵活性

    Spring 中通过反射获取bean:

    Spring 通过 XML 配置模式装载 Bean 的过程:

    1. 将程序内所有 XML 或 Properties 配置文件加载入内存中
    2. Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息
    3. 使用反射机制,根据这个字符串获得某个类的Class实例
    4. 动态配置实例的属性

    Spring这样做的好处是:

    • 不用每一次都要在代码里面去new或者做其他的事情
    • 以后要改的话直接改配置文件,代码维护起来就很方便了
    • 有时为了适应某些需求,Java类里面不一定能直接调用另外的方法,可以通过反射机制来实现
     
      

    3.应用场景:

    反射的重点在于runtime阶段的获取类信息和调用类方法,

    那么当你的编码过程中中有“部分信息是source阶段不清晰,需要在runtime阶段动态临时加载”这种场景,反射就可以派上用场了

  • 相关阅读:
    Sql Server 2016数据库定时备份操作步骤
    .net 生成原图和多张缩略图
    python小知识
    python小知识
    Q pi (lambda)
    GAE&reward shaping
    yield函数
    关于vs code和markdown
    强化学习第七章
    强化学习第六章
  • 原文地址:https://www.cnblogs.com/shawshawwan/p/8641678.html
Copyright © 2011-2022 走看看