Java基本操作—-反射

时间:2020-8-21 作者:admin


目录

反射

1. 概念

     面向对象:万物皆对象,一切事物都可以被描述成(类)对象,可以用类中的方法描述行为,类的成员变量来描述属性,类的构造方法对对象进行初始化。
     既然万物皆对象,那么类本身能不能被描述成对象?
     反射从理解上来说,就是一套API(类),这套API就是使用类来“描述”类的类。
所以反射中的主要类如下:

  • Class:描述类的类
  • Field:描述类中变量的类
  • Method:描述类中方法的类
  • Constructor:描述类中构造方法的类

2. 演示

2.1 获得Class的三种方式

 		//获得Class
        //方式1:
        Class class1 = User.class;
        //方式2:
        User user = new User();
        Class class2 = user.getClass();
        //方式3:框架使用获得class的方式
        Class<User> class3 = (Class<User>) Class.forName("com.leo.domain.User"); 

2.2 反射创建对象

     通过class创建对象:

		//newInstance:调用类的空参构造方法创建类的实例对象,相当于=>User u = new User();
        Object o = class3.newInstance();

     通过构造方法创建对象;

		//getConstructor:获取类中的所有构造方法
        Constructor[] constructors = class3.getConstructors();
        System.out.println(Arrays.toString(constructors));
        //获得空参构造器
        System.out.println(class3.getConstructor());
        //获得只有一个参数的构造器
        Constructor constructor = class3.getConstructor(Integer.class);
        System.out.println(constructor);
        //调用构造方法创建User对象
        User u2 = (User) constructor.newInstance(99);
        System.out.println(u2);

2.3 获得以及调用方法

     调用非静态方法

		//getMethod:获得类中的所用方法,包含继承来的方法
        Method[] methods1 = class3.getMethods();
        System.out.println(Arrays.toString(methods1));
        //getDeclaredMethods:获得类中的所有方法,不包含继承来的方法
        Method[] methods2 = class3.getDeclaredMethods();
        System.out.println(Arrays.toString(methods2));
        //调用指定方法 -> 获得一个名为setName的方法,该方法只接受一个String类型参数
        Method setNameMethod = class3.getDeclaredMethod("setName", String.class);
        //调用方法:执行方法 非静态方法调用 -> 创建对象
        setNameMethod.invoke(u2,"tom");//等同于:u2.setName("tom");
        System.out.println(u2);

     调用静态方法

//获得空参sayHello方法
        Method sayHello = class3.getDeclaredMethod("sayHello");
        //调用空参静态方法
        sayHello.invoke(null);//相当于->User.sayHello();

2.4 变量的获取&取值赋值

		//getFields:获得类中的所有变量,不包含私有变量
        Field[] fields1 = class3.getFields();
        System.out.println(Arrays.toString(fields1));
        //getDeclaredFields:获得类中的所有变量,包含私有变量
        Field[] fields2 = class3.getDeclaredFields();
        System.out.println(Arrays.toString(fields2));

        Field name = class3.getDeclaredField("name");
        //强制操作private类型变量
        name.setAccessible(true);
        //赋值
        name.set(u2,"jerry");//相当于:u2.name = jerry;
        //取值
        System.out.println(name.get(u2));
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。