JAVA基础“反射”

反射机制

  • 前言
  • 反射
    • 反射的介绍
    • 获取Class类对象的三种方式
      • 三种方式
    • 反射获取构造方法并使用
      • Class类获取构造方法对象的方法
      • Constructor类用于创建对象的方法
    • 反射获取成员变量
      • Class类获取成员变量对象的方法
      • Field类用于给成员变量赋值的方法
    • 反射获取成员方法
      • Class类获取成员方法对象的方法
      • Method类用于执行方法的方法

前言

反射机制

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

哪里用到反射机制?
1.JDBC中,利用反射动态加载了数据库驱动程序。
2.Web服务器中利用反射调用了Sevlet的服务方法。
3.Eclispe等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。
4.很多框架都用到反射机制,注入属性,调用方法,如Spring

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

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

通过对上面几个问题及答案的了解,相信很多小伙伴都有了一些关于反射的问题问题,带着问题去学习反射事半功倍!!!!

反射

反射的介绍

是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展。

获取Class类对象的三种方式

三种方式

  • 类名.class属性
  • 对象名.getClass()方法
  • Class.forName(全类名)方法
    示例代码:
//使用类的class属性来获取该类对应的Class对象
        Class<Student> c1 = Student.class;
        System.out.println(c1);
        //调用对象的getClass()方法,返回该对象所属类对应的Class对象
        Student s = new Student();
        Class<? extends Student> c2 = s.getClass();
            //使用Class类中的静态方法forName(String className)
        Class<?> c3 = Class.forName("com.itheima_02.Student");
 

反射获取构造方法并使用

Class类获取构造方法对象的方法

方法名 说明
Constructor[] getConstructors() 返回所有公共构造方法对象的数组
Constructor[] getDeclaredConstructors() 返回所有构造方法对象的数组
Constructor getConstructor(Class… parameterTypes) 返回单个公共构造方法对象
Constructor getDeclaredConstructor(Class… parameterTypes) 返回单个构造方法对象

Constructor类用于创建对象的方法

方法名 说明
T newInstance(Object…initargs) 根据指定的构造方法创建对象

示例代码:

Class<?> c = Class.forName("com.itheima_02.Student");

        //Constructor[] getConstructors() 返回一个包含 Constructor对象的数组, Constructor对象反映了由该 Class对象表示的类的所有公共构造函数
       Constructor<?>[] cons = c.getConstructors();
        //Constructor[] getDeclaredConstructors() 返回反映由该 Class对象表示的类声明的所有构造函数的 Constructor对象的数组
        Constructor<?>[] cons = c.getDeclaredConstructors();
        for(Constructor con : cons) {
     
            System.out.println(con);
        }
        System.out.println("--------");

        //Constructor getConstructor(Class... parameterTypes) 返回一个 Constructor对象,该对象反映由该 Class对象表示的类的指定公共构造函数
        //Constructor getDeclaredConstructor(Class... parameterTypes) 返回一个 Constructor对象,该对象反映由此 Class对象表示的类或接口的指定构造函数
        //参数:你要获取的构造方法的参数的个数和数据类型对应的字节码文件对象
        Constructor<?> con = c.getConstructor();
        //Constructor提供了一个类的单个构造函数的信息和访问权限
        //T newInstance(Object... initargs) 使用由此 Constructor对象表示的构造函数,使用指定的初始化参数来创建和初始化构造函数的声明类的新实例
        Object obj = con.newInstance();
        System.out.println(obj);
//        Student s = new Student();
//        System.out.println(s);

反射获取成员变量

Class类获取成员变量对象的方法

方法名 说明
Field[] getFields() 返回所有公共成员变量对象的数组
Field[] getDeclaredFields() 返回所有成员变量对象的数组
Field getField(String name) 返回单个公共成员变量对象
Field getDeclaredField(String name) 返回单个成员变量对象

Field类用于给成员变量赋值的方法

方法名 说明
voidset(Object obj,Object value) 给obj对象的成员变量赋值为value

示例代码:

public class ReflectDemo01 {
     
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
     
        //获取Class对象
        Class<?> c = Class.forName("com.itheima_02.Student");

        //Field[] getFields() 返回一个包含 Field对象的数组, Field对象反映由该 Class对象表示的类或接口的所有可访问的公共字段
        //Field[] getDeclaredFields() 返回一个 Field对象的数组,反映了由该 Class对象表示的类或接口声明的所有字段
//        Field[] fields = c.getFields();
        Field[] fields = c.getDeclaredFields();
        for(Field field : fields) {
     
            System.out.println(field);
        }
        System.out.println("--------");

        //Field getField(String name) 返回一个 Field对象,该对象反映由该 Class对象表示的类或接口的指定公共成员字段
        //Field getDeclaredField(String name) 返回一个 Field对象,该对象反映由该 Class对象表示的类或接口的指定声明字段
        Field addressField = c.getField("address");

        //获取无参构造方法创建对象
        Constructor<?> con = c.getConstructor();
        Object obj = con.newInstance();

//        obj.addressField = "西安";

        //Field提供有关类或接口的单个字段的信息和动态访问
        //void set(Object obj, Object value) 将指定的对象参数中由此 Field对象表示的字段设置为指定的新值
        addressField.set(obj,"西安"); //给obj的成员变量addressField赋值为西安

        System.out.println(obj);



//        Student s = new Student();
//        s.address = "西安";
//        System.out.println(s);
    }
}

反射获取成员方法

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类型

示例代码:

public class ReflectDemo01 {
     
    public static void main(String[] args) throws Exception {
     
        //获取Class对象
        Class<?> c = Class.forName("com.itheima_02.Student");

        //Method[] getMethods() 返回一个包含 方法对象的数组, 方法对象反映由该 Class对象表示的类或接口的所有公共方法,包括由类或接口声明的对象以及从超类和超级接口继承的类
        //Method[] getDeclaredMethods() 返回一个包含 方法对象的数组, 方法对象反映由 Class对象表示的类或接口的所有声明方法,包括public,protected,default(package)访问和私有方法,但不包括继承方法
//        Method[] methods = c.getMethods();
        Method[] methods = c.getDeclaredMethods();
        for(Method method : methods) {
     
            System.out.println(method);
        }
        System.out.println("--------");

        //Method getMethod(String name, Class... parameterTypes) 返回一个 方法对象,该对象反映由该 Class对象表示的类或接口的指定公共成员方法
        //Method getDeclaredMethod(String name, Class... parameterTypes) 返回一个 方法对象,它反映此表示的类或接口的指定声明的方法 Class对象
        //public void method1()
        Method m = c.getMethod("method1");

        //获取无参构造方法创建对象
        Constructor<?> con = c.getConstructor();
        Object obj = con.newInstance();

//        obj.m();

        //在类或接口上提供有关单一方法的信息和访问权限
        //Object invoke(Object obj, Object... args) 在具有指定参数的指定对象上调用此 方法对象表示的基础方法
        //Object:返回值类型
        //obj:调用方法的对象
        //args:方法需要的参数
        m.invoke(obj);

//        Student s = new Student();
//        s.method1();
    }
}

你可能感兴趣的:(java,java-ee,开发语言)