反 射

文章目录

一、反射概述

   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的反射?

  1. 通过一个全限类名创建一个对象
    • Class.forName(“全限类名”); 例如:com.mysql.jdbc.Driver Driver类已经被加载到 jvm中,并且完成了类的初始化工作就行了
    • 类名.class; 获取Class<?> clz 对象
    • 对象.getClass();
  2. 获取构造器对象,通过构造器new出一个对象
    • Clazz.getConstructor([String.class]);
    • Con.newInstance([参数]);
  3. 通过class对象创建一个实例对象(就相当与new类名()无参构造器)
    • Cls.newInstance();
  4. 通过class对象获得一个属性对象
    • Field c=cls.getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。
    • Field c=cls.getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的声明字段
  5. 通过class对象获得一个方法对象
    • Class.getMethod(“方法名”,class……parameaType);(只能获取公共的)
    • Class.getDeclareMethod(“方法名”);(获取任意修饰的方法,不能执行私有)
    • M.setAccessible(true);(让私有的方法可以执行)
  6. 让方法执行
    • Method.invoke(obj实例对象,obj可变参数);-----(是有返回值的)

2.Java反射机制的作用

  1. 在运行时判断任意一个对象所属的类
  2. 在运行时构造任意一个类的对象
  3. 在运行时判断任意一个类所具有的成员变量和方法
  4. 在运行时调用任意一个对象的方法

3.反射机制的优缺点?

  • 优点:可以动态执行,在运行期间根据业务功能动态执行方法、访问属性,最大限度发挥了java的灵活性。
  • 缺点:对性能有影响,这类操作总是慢于直接执行java代码。

4. 什么是反射?

 反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。

上一篇:ES6——类的创建、添加以及继承


下一篇:React Native constructor方法内外this的区别