反射获取对象并使用

一.获取Class对象

1.使用类的class属性来获取该类对应的Class对象

        //方法一
        Class<Student> studentClass = Student.class;
        System.out.println(studentClass);

运行结果: 

 

2.调用对象的getClass()方法

        //方法二
        Student student = new Student();
        Class<? extends Student> studentClass2 = student.getClass();
        System.out.println(studentClass2);

运行结果:  

3.Class类中的静态方法forName(String className)

        //方法三
        Class<?> studentClass3 = Class.forName("com.reflection.Student");
        System.out.println(studentClass3);

运行结果:  

 

 二.反射获取构造方法并使用

1.获取公共的构造方法(通过getConstructors方法)

        Class<?> aClass = Class.forName("com.reflection.Student");
        Constructor<?>[] constructors = aClass.getConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor);
        }

        System.out.println("----------");

运行结果:  

2.获取所有的构造方法(通过getDeclaredConstructors方法)

        Class<?> aClass = Class.forName("com.reflection.Student");
        Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }

运行结果:  

3.获取单个公共的构造方法(通过参数的类型来匹配对应的构造方法)

        Class<?> aClass = Class.forName("com.reflection.Student");
        Constructor<?> constructor = aClass.getConstructor(String.class, Integer.class, String.class);
        System.out.println(constructor);

运行结果:

 

4. 获取单个构造方法

        //获取单个构造方法
        Class<?> aClass = Class.forName("com.reflection.Student");
        Constructor<?> constructor = aClass.getDeclaredConstructor(String.class, Integer.class);
        System.out.println(constructor);

运行结果

5.通过构造方法创建对象(通过调用Constructor类中的newInstance方法实列化对象)

        //获取单个构造方法
        Class<?> aClass = Class.forName("com.reflection.Student");
        Constructor<?> constructor = aClass.getDeclaredConstructor(String.class, Integer.class);
        System.out.println(constructor);

运行结果:

三.获取成员变量并使用

1.获取所有的公共成员变量数组

        Class<?> aClass = Class.forName("com.reflection.Student");
        Field[] fields = aClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }

运行结果:

 

2.获取所有的成员变量数组

        Class<?> aClass = Class.forName("com.reflection.Student");
        Field[] fields = aClass.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field);
        }

运行结果:

3..获取单个公共成员变量

        Class<?> aClass = Class.forName("com.reflection.Student");
        Field weight = aClass.getField("weight");
        Field height = aClass.getField("height");
        System.out.println(weight);
        System.out.println(height);

运行结果:

 

4.获取单个成员变量

        Class<?> aClass = Class.forName("com.reflection.Student");
        Field weight = aClass.getDeclaredField("weight");
        Field height = aClass.getDeclaredField("name");
        Field age = aClass.getDeclaredField("age");
        System.out.println(weight);
        System.out.println(height);
        System.out.println(age);

运行结果:

5.给object对象赋值

        //获取class对象
        Class<?> aClass = Class.forName("com.reflection.Student");
        //对象实列化(调用无参构造方法)
        Constructor<?> constructor = aClass.getConstructor();
        Object o = constructor.newInstance();
//        获取成员变量

        Field name = aClass.getDeclaredField("name");
//        private类型的变量无法直接赋值
//        通过setAccessible方法  暴力反射 ,使程序在运行时逃过检测
        name.setAccessible(true);
//        对Object对象进行赋值
        name.set(o,"张三丰");
        Field age = aClass.getDeclaredField("age");
        age.setAccessible(true);
        age.set(o,33);
        Field height = aClass.getDeclaredField("height");
        height.set(o,178.5F);
        System.out.println(o);

运行结果:

 四.获取方法并使用

 1.获取所有的公共方法数组(包括继承)

        Class<?> aClass = Class.forName("com.reflection.Student");
        Method[] methods = aClass.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }

运行结果:

 ​​​​

 

2.获取所有的方法数组(不包括继承)

        //获取所有成员变量
        Class<?> aClass = Class.forName("com.reflection.Student");
        Method[] methods = aClass.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method);
        }

运行结果:

 

3..获取单个公共方法并使用

        //获取单个公共成员变量
        Class<?> aClass = Class.forName("com.reflection.Student");
        Constructor<?> constructor = aClass.getConstructor();
        Object o = constructor.newInstance();
        Method teach = aClass.getMethod("teach", String.class);
        teach.invoke(o,"王二麻子");

运行结果:

 

4.获取单个方法

        //获取单个成员变量
        Class<?> aClass = Class.forName("com.reflection.Student");
        Constructor<?> constructor = aClass.getConstructor();
        Object o = constructor.newInstance();
        Method study = aClass.getDeclaredMethod("study");
//        private类型需要使用暴力反射逃过运行检测
        study.setAccessible(true);
        study.invoke(o);

运行结果:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jjp_jp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值