原创

JAVA反射机制及其应用

JAVA反射机制:

几个重要的JAVA反射类有:ClassLoaderClassConstructorMethod

1 通过ClassLoader获取当前线程的类对象,代码如下:

ClassLoader loader = Thread.currentThread().getContextClassLoader();//获取当前线程的classLoader

Class clazz = loader.loadClass("com.packageName.className");//使用classLoaderloadClass方法,传入全路径类名之后获取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

工作机制: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 loadClassString 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通过类反射对象获取类的构造函数,成员变量以及方法等类元素的反射对象,反射对象类在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)方法获得该反射类对象)

正文到此结束
Loading...