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);
京公网安备 11010502036488号