文章目录
- 一、反射概述
- 二、获取Class类对象的三种方式
- 三、反射获取构造方法并使用
- 四、反射获取成员变量对象的方法
- 五、反射获取成员方法并使用
- 六、反射常见面试题
- 1.如何使用Java的反射?
- 2.Java反射机制的作用
- 3.反射机制的优缺点?
- 4. 什么是反射?
一、反射概述
Java发反射机制:是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展.
二、获取Class类对象的三种方式
1.类名.class属性
使用类的class属性来获取该类对应的Class对象
示例:
Class<Student> c1 = Student.class;
System.out.println(c1);
2.对象名.getClass()方法
调用对象的getClass()方法,返回该对象所属类对应的Class对象
示例:
Student s = new Student();
Class<? extends Student> c3 = s.getClass();
3.Class.forName(全类名)方法
使用Class类中的静态方法forName(String className)
示例:
Class<?> c4 = Class.forName("com.test_02.Student");
三、反射获取构造方法并使用
1.Class类获取构造方法对象的方法
方法名 | 说明 |
---|---|
Constructor<?>[] getConstructors() | 返回所有公共构造方法对象的数组 |
Constructor<?>[] getDeclaredConstructors() | 返回所有构造方法对象的数组 |
Constructor getConstructor(Class<?>… parameterTypes) | 返回单个公共构造方法对象 |
Constructor getDeclaredConstructor(Class<?>… parameterTypes) | 返回单个构造方法对象 |
- Constructor<?>[] getConstructors() 返回一个包含 Constructor对象的数组, Constructor对象反映了由该 Class对象表示的类的所有公共构造函数
- Constructor<?>[] getDeclaredConstructors() 返回反映由该 Class对象表示的类声明的所有构造函数的 Constructor对象的数组
- Constructor getConstructor(Class<?>… parameterTypes) 返回一个 Constructor对象,该对象反映由该 Class对象表示的类的指定公共构造函数
- Constructor getDeclaredConstructor(Class<?>… parameterTypes) 返回一个 Constructor对象,该对象反映由此 Class对象表示的类或接口的指定构造函数
2.Constructor类用于创建对象的方法
- T newInstance(Object…initargs):根据指定的构造方法创建对象
四、反射获取成员变量对象的方法
方法名 | 说明 |
---|---|
Field[] getFields() | 返回所有公共成员变量对象的数组 |
Field[] getDeclaredFields() | 返回所有成员变量对象的数组 |
Field getField(String name) | 返回单个公共成员变量对象 |
Field getDeclaredField(String name) | 返回单个成员变量对象 |
- Filed类用于给成员变量赋值的方法
voidset(Object obj,Object value):给obj对象的成员变量赋值为value
五、反射获取成员方法并使用
- Class类获取成员方法对象的方法
方法名 | 说明 |
---|---|
Method[] getMethods() | 返回所有公共成员方法对象的数组,包括继承的 |
Method[] getDeclaredMethods() | 返回所有成员方法对象的数组,不包括继承的 |
Method getMethod(String name, Class<?>… parameterTypes) | 返回单个公共成员方法对象 |
Method getDeclaredMethod(String name, Class<?>… parameterTypes) | 返回单个成员方法对象 |
- Method类用于执行方法的方法
Objectinvoke(Object obj,Object… args):调用obj对象的成员方法,参数是args,返回值是Object类型
六、反射常见面试题
1.如何使用Java的反射?
- 通过一个全限类名创建一个对象
- Class.forName(“全限类名”); 例如:com.mysql.jdbc.Driver Driver类已经被加载到 jvm中,并且完成了类的初始化工作就行了
- 类名.class; 获取Class<?> clz 对象
- 对象.getClass();
- 获取构造器对象,通过构造器new出一个对象
- Clazz.getConstructor([String.class]);
- Con.newInstance([参数]);
- 通过class对象创建一个实例对象(就相当与new类名()无参构造器)
- Cls.newInstance();
- 通过class对象获得一个属性对象
- Field c=cls.getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。
- Field c=cls.getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的声明字段
- 通过class对象获得一个方法对象
- Class.getMethod(“方法名”,class……parameaType);(只能获取公共的)
- Class.getDeclareMethod(“方法名”);(获取任意修饰的方法,不能执行私有)
- M.setAccessible(true);(让私有的方法可以执行)
- 让方法执行
- Method.invoke(obj实例对象,obj可变参数);-----(是有返回值的)
2.Java反射机制的作用
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
3.反射机制的优缺点?
- 优点:可以动态执行,在运行期间根据业务功能动态执行方法、访问属性,最大限度发挥了java的灵活性。
- 缺点:对性能有影响,这类操作总是慢于直接执行java代码。
4. 什么是反射?
反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。