1. 什么是java反射机制?
Java的反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法;对于任意一个对象,都能够调用它的任何方法和属性。这种动态获取类的信息以及动态调用方法的功能称为Java语言的反射(reflection)机制。
2. 什么是反射类
动态获取类或者对象的信息(属性和方法),以及动态操作对象的属性和方法的类,动态分析和使用类的信息的类。
注:动态是指在java运行状态。
3. 反射的作用
1.动态获取对象的信息(对象的属性和方法);
2.动态调用对象的属性和方法;
例如:Java程序中一些对象在运行时会出现两种类型:运行时类型和编译时类型,例如一个向上转型的代码:Bird bird = new Animal();其中,bird在编译时类型为Bird,运行时类型为Animal,通过反射机制就能在程序运行时发现该对象和类的真实信息。
4. 反射的使用场景
1.操作因访问权限限制的属性和方法;
2.实现自定义注解;
3.动态加载第三方jar包;
4.按需加载类,节省编译和初始化时间。
5.反射技术的使用
5.1 反射主要涉及的类
反射技术的核心技术是Class对象,每个类在定义以后都有各自的Class对象。
5.2 反射技术主要框架
5.3 获取Class对象的三种方式
(1)使用Class.forName方法(“类的全路径名”);
(2)使用需要反射的类名调用class方法;
(3)使用需要反射的类的对象调用getClass方法
Class<?> c1 = Class.forName("com.beantechs.model.Point");
Class<Point> c2 = Point.class;
Class<? extends Point> c3 = new Point(1.0, 2.0, 3.0).getClass();
System.out.println(c1==c3);
打印结果为true
5.4 Class对象获取类常见的方法
- getClassLoader():获得类的加载器;
- getDeclaredClasses():返回一个数组,数组中包含该类中所有类和接口类的对象;
- forName(String classRoad):根据类的路径返回类的Class对象(该方法是静态成员方法);
- newInstacne():创建类的实例;
- getName():获得类的完整路径名。
5.5 调用类中的私有构造方法
- getConstructor(Class…<?>parameterTypes):获得该类中与参数类型匹配的公有的构造方法;
- getConstructors(): 获得该类中所有公有的构造方法;
- getDeclaredConstructor(Class…<?>parameterTypes):获得该类中与参数类型匹配的构造方法;
- getDeclaredConstructors():获得该类中所有构造方法。
5.6 使用类中的私有成员变量
- getField(String name):获得该类中某个公有的字段;
- getFields():获得该类中所有的共有字段;
- getDeclaredField(String name):获得该类中某个字段;
- getDeclaredFields():获得该类中所有字段。
5.7 调用类中的私有成员方法
- getMethod(String name,Class…<?>parameterTypes):获得该类中某个共有的方法;
- getMethods():获得该类中所有的共有方法;
- getDeclaredMethod(String name,Class…<?>parameterTypes):获得该类中某个方法;
- getDeclaredMethods():获得该类中所有方法。
6. 反射的优点与缺点
优点:对于任意一个类,都能够获得这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法,增加程序的灵活性和扩展性,降低耦合性。
缺点:使用反射会导致程序效率降低(为了获得一个类的对象,调用了Class类中的多个方法),反射机制绕过了源代码,可能会带来维护问题。