1、反射的概述

反射(Reflection) 是动态语言的关键;何为动态语言?最简单的理解是public void test(A a){}这个对象类A若是通过反射获取,那么在编译时可以检查不存在。

2、Class类

  • Class类是由系统建立的,若是想通过反射获取类class/interface/enum/annotation/primitive type/void/[] 就必须使用Class类;
  • Class 类是 Reflection 的根源,针对任何你想动态加载、运行的类,唯有先获得相应的Class 对象理解 Class 类并获取 Class 的实例

Class类中包含的方法
常用方法
**获取Class对象的方法

public class A {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, ClassNotFoundException {
        Class clazz2 = "com.meng.javase.B".getClass();
        Class<?> clazz3 = Class.forName("com.meng.javase.B");
        Class<B> clazz1 = B.class;
        Object o =  clazz3.newInstance();
        Method method = (Method) clazz3.getDeclaredMethod("method").invoke(o,null);
        /**
         * public Object invoke(Object obj, Object... args)
         * @param obj  调用底层方法的对象
         * @param args 用于方法调用的参数
         */
    }
}

class B{  
    private String age;
    public void method(){
        System.out.println("我是反射获取的方法");
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
}

3、类的加载和ClassLoader的理解

3.1、.class的加载

通过反射将.class文件加载到内存中,然后生成java.lang.Class对象,这个对象指向方法区中的类数据例如方法、属性等。所有需要访问和使用类数据都得通过Class访问。
图片说明
##3.2 链接
链接就是将static 修饰的属性,方法(类变量)加载到常量池中,并设置类变量的默认初始值。

3.3 初始化

执行类构造器<clinit>()方法的过程。在这个过程中会自动收集类变量的赋值动作,和静态代码块的执行。</clinit>

3.4 类加载器的主要用法

InputStream in = null;
in = this.getClass getClassLoader getResourceAsStream ("exer2 test.properties
System.out.println (in);