开发工具与关键技术:MyEclipse 10;Java基础语法
撰写时间:2019-07-05
反射其实就是动态加载一个指定的类,并获取该类中的所有的内容。而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员。简单说: 反射技术可以对一个类进行解剖。而反射的好处是大大的增强了程序的扩展性。Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性。
反射的基本步骤:
- 获得 Class 对象,就是获取到指定的名称的字节码文件对象。
- 实例化对象,获得类的属性、方法或构造函数。
- 访问属性、调用方法、调用构造函数创建对象。获取这个 Class 对象,有三种方式:
- 通过每个对象都具备的方法 getClass 来获取。弊端:必须要创建该类对象,才可以调用 getClass 方法。
- 每一个数据类型 ( 基本数据类型和引用数据类型 ) 都有一个 静态的属性 class 。弊端:必须要 先明确该类。 前两种方式不利于程序的扩展,因为都需要在程序使用具体的类来完成。
- 使用的 Class 类中的方法, 静态的 forName 方法 。 指定什么类名,就获取什么类字节码文件对象,这种方式的扩展性最强,只要将类名的字符 串传入即可。
反射的用法 :
- 需要获得 java 类的各个组成部分, 首先需要获得类的 Class对象,获得 Class对象的三种方式:
Class.forName(classname) 用于做类加载
obj.getClass() 用于获得对象的类型
类名.class 用于获得指定的类型,传参用
- 反射类的成员方法:
Class clazz = Person.class;
Method method = clazz.getMethod(methodName, new Class[]{paramClazz1, paramClazz2});
method.invoke();
- 反射类的构造函数:
Constructor con = clazz.getConstructor(new Class[]{paramClazz1, paramClazz2,...})
con.newInstance(params...)
- 反射类的属性:
Field field = clazz.getField(fieldName);
field.setAccessible(true);
field.setObject(value);
反射机制的优点与缺点:
为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念,
静态编译:在编译时确定类型,绑定对象,即通过。
动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了 java 的灵活性,体 现了多态的应用,有以降低类之间的藕合性。
一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在 J2EE 的开发。
它的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉 JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。