Java中的反射

概念
Java的反射机制是指:
在这里插入图片描述
在这里插入图片描述
1.利用反射可以无视修饰符获取类中所有的属性和方法。
2.先获取配置文件中的信息,动态获取信息并创建对象和调用方法。

获取Class对象
在这里插入图片描述

// 1.利用Class中的静态方法forName(String 全类名)
        Class<?> aClass = Class.forName("domain.Student");
        System.out.println(aClass);

        // 2.通过Class属性来获取
        Class<?> bClass = Student.class;
        System.out.println(bClass);

        // 3.通过对象的getClass方法来获取对象,该方法是定义在Object中的
        Student s = new Student();
        Class<?> cClass = s.getClass();
        System.out.println(cClass);

		System.out.println(aClass == bClass);
        System.out.println(bClass == cClass);
打印结果:
class domain.Student
class domain.Student
class domain.Student
true
true

获取Constructor对象

1.类的属性都是Field对象。
2.类的构造方法都是Constructor对象。
3.类的成员方法都是Method对象。

Class中的方法:

  1. Constructor<?>[] getConstructors()返回包含一个数组 Constructor对象反射由此表示的类的所有公共构造 类对象。
// 获取Class对象
        Class<?> aClass = Class.forName("domain.Student");
        //Constructor<?>[] getConstructors()返回包含一个数组 Constructor对象反射由此表示的类的所有公共构造 类对象。
        Constructor<?>[] constructors = aClass.getConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor);
        }
  1. Constructor<?>[] getDeclaredConstructors()返回一个反映 Constructor对象表示的类声明的所有 Constructor对象的数组 类 。
// 获取Class对象
        Class<?> aClass = Class.forName("domain.Student");
        //Constructor<?>[] getDeclaredConstructors()返回一个反映 Constructor对象表示的类声明的所有 Constructor对象的数组 类 。
        Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }
  1. Constructor getConstructor(Class<?>… parameterTypes)返回一个 Constructor对象,该对象反映 Constructor对象表示的类的指定的公共 类函数。
// 获取Class对象
        Class<?> aClass = Class.forName("domain.Student");
        //Constructor<T> getConstructor(Class<?>... parameterTypes)返回一个 Constructor对象,该对象反映 Constructor对象表示的类的指定的公共 类函数。
        // 注意:小括号中必须跟方法的形参保持一致,并且方法必须是public的
        Constructor<?> constructor1 = aClass.getConstructor();
        System.out.println(constructor1);

        Constructor<?> constructor2 = aClass.getConstructor(String.class, int.class);
        System.out.println(constructor2);
  1. Constructor getDeclaredConstructor(Class<?>… parameterTypes)返回一个 Constructor对象,该对象反映 Constructor对象表示的类或接口的指定 类函数。
// 获取Class对象
        Class<?> aClass = Class.forName("domain.Student");
        //Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)返回一个 Constructor对象,该对象反映 Constructor对象表示的类或接口的指定 类函数。
        // 该方法可以获取类中任何权限的方法
        Constructor<?> declaredConstructor1 = aClass.getDeclaredConstructor(String.class, int.class);
        System.out.println(declaredConstructor1);

利用Constructor创建对象
1.T newInstance(Object…) // 根据指定构造方法创建对象。

// 获取Class对象
        Class<?> aClass = Class.forName("domain.Student");
        // 获取构造方法对象
        Constructor<?> constructor = aClass.getConstructor(String.class, int.class);

        // 利用newInstance方法创建对象
        Student zhangsan = (Student)constructor.newInstance("zhangsan", 23);
        System.out.println(zhangsan);
// 获取Class对象
        Class<?> aClass = Class.forName("domain.Student");
        // 获取构造方法对象
        Constructor<?> constructor = aClass.getDeclaredConstructor(String.class, int.class);

        // 若要使用反射强行使用private修饰的构造方法创建对象
        // 需要调用以下方法
        constructor.setAccessible(true);// 暴力反射

        // 利用newInstance方法创建对象
        Student zhangsan = (Student)constructor.newInstance("zhangsan", 23);
        System.out.println(zhangsan);

反射获取成员变量

在这里插入图片描述

// 获取Class对象
        Class<?> aClass = Class.forName("domain.Student");
        // 获取public修饰的成员变量
        Field[] fields = aClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
// 获取Class对象
        Class<?> aClass = Class.forName("domain.Student");
        // 获取所有成员变量
        Field[] fields = aClass.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field);
        }
// 获取Class对象
        Class<?> aClass = Class.forName("domain.Student");
        // 获取指定存在的public成员变量
        Field name = aClass.getField("name");
        System.out.println(name);
// 获取Class对象
        Class<?> aClass = Class.forName("domain.Student");
        // 获取指定存在的私有成员变量
        Field birthday = aClass.getDeclaredField("birthday");
        System.out.println(birthday);

使用Field赋值和获取值
在这里插入图片描述

// 获取Class对象
        Class<?> aClass = Class.forName("domain.Student");

        // 获取Field对象
        Field name = aClass.getField("name");

        // 利用Field中的set方法进行赋值
        Student stu = (Student) aClass.newInstance();
        name.set(stu, "zhangsan");
        System.out.println(stu);

        // 利用Field中的get方法获取属性值
        Object o = name.get(stu);
        System.out.println(o);

若所赋值的成员变量是私有的:

// 获取Class对象
        Class<?> aClass = Class.forName("domain.Student");

        // 获取Field对象
        Field birthday = aClass.getDeclaredField("birthday");

        birthday.setAccessible(true); // 暴力反射

        // 利用Field中的set方法进行赋值
        Student stu = (Student) aClass.newInstance();
        birthday.set(stu, "2020-11-11");
        System.out.println(stu);

        // 利用Field中的get方法获取属性值
        Object o = birthday.get(stu);
        System.out.println(o);

反射获取Method对象

// 获取Class对象
        Class<?> aClass = Class.forName("domain.Student");

        // 获取公共成员方法
        Method[] methods = aClass.getMethods();// 会同时获取父类继承下来的方法
        for (Method method : methods) {
            System.out.println(method);
        }
// 获取Class对象
        Class<?> aClass = Class.forName("domain.Student");

        // 获取所有成员方法
        Method[] methods = aClass.getDeclaredMethods();// 不会获取父类的方法
        for (Method method : methods) {
            System.out.println(method);
        }
// 获取Class对象
        Class<?> aClass = Class.forName("domain.Student");

        // 获取指定public成员方法
        Method setName = aClass.getMethod("setName", String.class);

        // 获取指定private成员方法
        Method setSid = aClass.getDeclaredMethod("setSid", String.class);

        System.out.println(setName);
        System.out.println(setSid);

通过Method运行获取到的方法
Object invoke(Object obj, Object…)
在这里插入图片描述

// 获取Class对象
        Class<?> aClass = Class.forName("domain.Student");

        Method function = aClass.getMethod("function", String.class);

        // 以下则是调用获取到的方法的过程
        Student stu = (Student) aClass.newInstance();
        Object zhang = function.invoke(stu, "zhang");

        System.out.println(zhang);

若function是私有的:

// 获取Class对象
        Class<?> aClass = Class.forName("domain.Student");

        Method function = aClass.getDeclaredMethod("function", String.class);

        function.setAccessible(true); // 暴力反射

        // 以下则是调用获取到的方法的过程
        Student stu = (Student) aClass.newInstance();
        Object zhang = function.invoke(stu, "zhang");

        System.out.println(zhang);
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值