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阶段动态临时加载”这种场景,反射就可以派上用场了

原文地址:https://www.cnblogs.com/shawshawwan/p/8641678.html