几个重要的JAVA反射类有:ClassLoader,Class,Constructor和Method
1 通过ClassLoader获取当前线程的类对象,代码如下:
ClassLoader loader = Thread.currentThread().getContextClassLoader();//获取当前线程的classLoader
Class clazz = loader.loadClass("com.packageName.className");//使用classLoader的loadClass方法,传入全路径类名之后获取class对象
2 获取类的默认构造器对象并通过该对象实例化目标类的对象:
Constructor con = clazz.getDeclareConstructor((Class[]) null);//获取类构造器
Car car = con.newInstance();//创建目标类对象
3 通过反射方法设置属性:
Method setBrand = class.getMethod("setBrand",String.class);//getMethod方法传入所调用的方法名以及调用方法的入参类型,这样便通过反射机制获取到了方法的反射对象
setBrand.invoke(car,"BRAND_NAME");//使用方法反射对象的invoke方法,传入目标对象示例以及方法的入参后,便可调用目标方法
工作机制:ClassLoader将类加载入JVM中,其经过以下步骤:1 装载 查找和导入Class文件 2 链接 执行校验、准备和解析步骤,其中解析步骤是可以选择的:1)校验 检查载入Class文件数据的正确性 2) 准备 为静态变量分配存储空间 3) 将符号引用转化为直接引用 3 初始化 对类的静态变量、静态代码块执行初始化工作
类的装载工作由ClassLoader及其子类负责,负责在运行时查找和装入Class字节码文件,主要分为根装载器(C++编写),ExtClassLoade ,AppClassLoader,其中根装载器用来装载JRE的核心类库,ExtClassLoader负责装载JRE扩展目录ext中的jar包,APPClassLoader负责装载ClassPath下的类包。JVM在装载类时使用“全盘负责委托机制”。
ClassLoader的重要方法:
Class loadClass(String name),根据类的全名装载类
Class defineClass(String name,byte[] b,int off,int len):将类文件的字节数组转化为JVM内部的java.lang.Class对象,每一个类在JVM中皆存在该类对应的java.lang.Class对象
Class findSystemClass(String name)JVM默认使用该类装载机制进行本地类的装载
Class findLoadedClass (String name)查看ClassLoader是否已经装载某类
ClassLoader getParent() 获取类装载器的父装载器
Java通过类反射对象获取类的构造函数,成员变量以及方法等类元素的反射对象,反射对象类在java.reflect包中进行定义,最主要的反射类如下:
Constructor: 类的构造函数反射类,可以通过其中的newInstance(Object… initargs)进行对象类示例的创建。(使用Class#getConstructors(Class… parameterTypes)方法获得该反射类对象)
Method: 类方法的反射类,可以使用其中的invoke(Object obj,Object… args[])对目标对象进行操作,还要Class getReturnType()获取方法的返回值类型,Class[] getParameterTypes() 获取方法的入参类型数组 Class[] getExceptionTypes()获取方法的异常类型数组 Annotation[][] getParameterAnnotations() 获取方法的注解信息。(使用Class#getDeclaredMethod(String name,Class… parameterTypes)方法获得该反射类对象)
Field: 类成员变量的反射类 主要方法是set(Object obj,Object value),通过该方法为目标对象obj的成员变量value赋值。(使用Class#getDeclaredField(String name)方法获得该反射类对象)