二、运行机制
三、反射机制的作用
四、特点
我们从以上四个方面了解!
一、java反射机制的概念
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。说得通俗一点就是动态执行代码。
二、运行机制
Java程序在运行时,JRE(Java Runtime Environment)一直对所有的对象进行着运行时类型标识。
这项信息记录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。也就是说,ClassLoader找到了需要调用的类时(java为了调控内存的调用消耗,类的加载都在需要时再进行),就会加载它,然后根据.class文件内记载的类信息来产生一个与该类相联系的独一无二的Class对象。该Class对象记载了该类的字段,方法等等信息。以后jvm要产生该类的实例,就是根据内存中存在的该Class类所记载的信息(Class对象应该和我所了解的其他类一样会在堆内存内产生、消亡)来进行。而java中的Class类对象是可以获取到的(虽然你无法像其他类一样运用构造器来得到它的实例,因为Class对象都是jvm产生的)基于这个基础,java实现了反射机制。
Eg:
在写j2ee的model层的时候,有一些代码是每次都得写的,比如对于每个对象的CURD操作,list,分页等等,每个对象都得写这样的重复代码。
我写了一个接口BaseDaoInterface,和一个抽象类,BaseDaoImpl,在这里面定义好增删改查,当然每个的参数都是Object,然后比如UserDaoInterface继承BaseDaoInterface,
UserDaoImpl继承BaseDaoImpl,这样在进行这些每个对象都需要的方法的时候直接调用super.add(vo.getClass().getName,vo)就行了,会自动添加到对应的表中去,这里面在写BaseDaoImpl的时候就全部用的反射,写这个工具类的时候不知道以后传进来的对象或者类是什么,都是Object的,只有当运行的时候才能知道是什么类型,这就是动态调用。
反射机制获取类有三种方法:
1.直接通过类名.Class的方式得到。
Class cla = Person.class;
System.out.println("通过类名: " + cla);
2.通过对象的getClass()方法获取,这个使用的少(一般是传的是Object,不知道是什么类型的时候才用)。
Object obj = new Person();
cla = obj.getClass();
ystem.out.println("通过getClass(): " + cla);
3.通过全类名获取,用的比较多,但可能抛出ClassNotFoundException异常。
Class cla = Class.forName("com.java.reflection.Person");
System.out.println("通过全类名获取: " + cla);
三、反射机制的作用
1.反编译:.class --> .java
2.通过反射机制访问java对象的属性,方法,构造方法等;
四、特点
1.所有的属性和方法都是动态获取的。
2. 通过反射读取里边的内容。这样代码是固定的,但是配置文件的 内容我们可以改,这样使我们的代码灵活了很多!优点:能够使我们的代码更加灵活,更加容易实现面向对象。
缺点:会降低程序的性能,而且复杂度更高。(反射是需要解析字 节码,将内存中的对象进行解析)