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);