反射
一、反射的概述
反射机制允许java程序加载一个运行时才得知其名称的类,获悉其完整API信息,包括其修饰符、超类、实现的接口,也包括属性和方法的所有信息;
二、反射的作用
能够分析类能力的程序成为反射(reflective)。反射的功能极其强大,可以用来:
a、在运行时分析类的能力
b、在运行时检查对象,例如,编写一个适用于所有类的toString方法。
c、实现泛型数组操作代码
d、生成动态代理
注:如果只对编写应用程序感兴趣,而不是要为其他java程序员构建工具,可以只做了解
三、Class类
每个类都有与之对应的一个Class类对象,哪怕它是基础数据类型,例如int,enum,或者注解,Class类对象是反射的入口,封装了当前对象所对应的类的信息
获取Class对象的三种方式
package com.entity; /** * @author 26414 */ public class Person { @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } private String name; private Integer age; public String getName() { return name; } public Person() { } public Person(String name, Integer age) { this.name = name; this.age = age; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
package com.demo; import com.entity.Person; /** * @author 26414 */ public class Reflect { public static void main(String[] args) throws ClassNotFoundException { //1.通过类名获取,类名.class Class<Person> clz1 = Person.class; //2.通过对象获取 ,对象名.getClass() Person person = new Person(); Class<? extends Person> clz2 = person.getClass(); //3.通过全类名获取,Class.forName(全类名) Class<?> clz3 = Class.forName("com.entity.Person"); System.out.println(clz1 == clz2); System.out.println(clz2 == clz3); } }
四、常用的反射机制类
java.lang.Class; //类 java.lang.reflect.Constructor;//构造方法 java.lang.reflect.Field; //类的成员变量 java.lang.reflect.Method;//类的方法 java.lang.reflect.Modifier;//访问权限
五、在什么地方用到了反射?
a、与注解结合的框架,例如Spring
b、JDBC的数据库的连接
六、常用方法
七、反射的优缺点:
反射机制使人们可以在运行时查看字段和方法,从而能编写更具有通用性的程序。这种功能对于编写系统程序极其有用,但通常不适于编写应用程序。反射是很脆弱的,如果使用反射,编译器将无法查找编程错误,只有在运行时才会发现错误并导致异常,影响性能。