JAVA 基础之 知其所以然


一、反射

  1. 何为反射机制:在运行状态中,对于任意一个类,都能够获取这个类的属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取的信息以及动态调用的方法的功能称之为反射机制。
  2. 反射机制能做什么:
    1. 在运行时判断任意一个对象所属的类。
    2. 在运行时构造任意一个类的对象。
    3. 在运行时判断任意一个类所具有的成员变量和方法。
    4. 在运行时调用任意一个对象的方法。
    5. 生成动态代理。

二、JAVA类加载

  每个Java程序执行前都必须经过编译、加载、连接、和初始化这几个阶段
    加载:查找并加载类的二进制数据
    连接:1.验证:确保被加载的类的正确性
       2.准备:为类的静态变量分配内存,并将其初始化为默认值
         3.解析:把类中的符号引用转换为直接引用
    初始化:为类的静态变量赋予正确的初始值

    i、加载是指将编译后的java类文件(也就是.class文件)中的二进制数据读入内存,并将其放在
      运行时数据区的方法区内,然后再堆区创建一个Java.lang.Class对象,用来封装类在方法区的数据结构。
      即加载后最终得到的是Class对象,并且更加值得注意的是:该Java.lang.Class对象是单实例的,
      无论这个类创建了多少个对象,他的Class对象是唯一的!!!!。
      而 加载并获取该Class对象可以通过三种途径:
        Class.forName(类的全路径)、实例对象.class(属性)、实例对象getClass()。

      在连接和初始化阶段,其实静态变量经过了两次赋值:
        第一次是静态变量类型的默认值;
        第二次是我们真正赋给静态变量的值。



三、使用

  1.   Integer数组中加入String 类型的字符串。  
	public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		List<Integer> list = new ArrayList<>();
		Method method = list.getClass().getMethod("add", Object.class);
		method.invoke(list, "java 反射");
		
		System.out.println(list.get(0));
		
	}

四、好处

  使用反射的好处:
    1.创建的对象不用new
    2.可以动态创建对象(把要创建的对象的类型写在配置文件中,每次程序启动读取配置文件,再自动创建对象)

五、new 和 newInstance区别

  newInstance: 弱类型。低效率。只能调用无参构造。
  new: 强类型。相对高效。能调用任何public构造。

原文地址:https://www.cnblogs.com/binbang/p/6513146.html