反射调用方法,实例化对象,字段赋值

准备一个类,有参构造方法,字段,方法都是私有的

public class Car {
    private String name;
    private Integer age;

    private Car(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    private void say() {
        System.out.println("我是一只猫");
    }

    @Override
    public String toString() {
         System.out.println("Car{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}');
        return "Car{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

通过反射获取私有的构造方法

    @Test
    public void reflex1() throws Exception {
        //获取字节码文件
        Class<Car> clazz = Car.class;
        //获取参数第一个为String类型和第二个为Integer类型的构造方法
        Constructor<Car> constructor = clazz.getDeclaredConstructor(String.class, Integer.class);
        //使用时取消 Java 语言访问检查
        constructor.setAccessible(true);
        //传参
        Car car = constructor.newInstance("咖菲猫", 10);
        System.out.println(car);
    }

控制台打印: Car{name=’咖菲猫’, age=10}

通过反射获取类的字段并赋值

    @Test
    public void reflex2() throws Exception {
        //获取字节码文件
        Class<Car> clazz = Car.class;
        //获取参数第一个为String类型和第二个为Integer类型的构造方法
        Constructor<Car> constructor = clazz.getDeclaredConstructor();
        //使用时取消 Java 语言访问检查
        constructor.setAccessible(true);
        //实例化对象
        Car car = constructor.newInstance();
        //获取所有字段数组
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            //打印字段名和类型
            System.out.println("字段名=" + field.getName() + "字段类型=" + field.getType());
            field.setAccessible(true);
            if (field.getType().equals(String.class)) {
                field.set(car, "咖菲猫");
            }
            if (field.getType().equals(Integer.class)) {
                field.set(car, 11);
            }
        }
        System.out.println(car);
    }

控制台打印: 字段名=name字段类型=class java.lang.String 字段名=age字段类型=class java.lang.Integer Car{name=’咖菲猫’, age=11}

通过反射获取所用方法,并且调用

    @Test
    public void reflex3() throws Exception {
        //获取字节码文件
        Class<Car> clazz = Car.class;
        //获取参数第一个为String类型和第二个为Integer类型的构造方法
        Constructor<Car> constructor = clazz.getDeclaredConstructor();
        //使用时取消 Java 语言访问检查
        constructor.setAccessible(true);
        //实例化对象
        Car car = constructor.newInstance();
        //获取所有方法名 但不包括继承的方法
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println("方法名=" + method.getName());
            //使用时取消 Java 语言访问检查
            method.setAccessible(true);
            //调用方法
            method.invoke(car);
        }
    }

控制台打印: 方法名=toString Car{name=’null’, age=null} 方法名=say 我是一只猫

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏coder修行路

Java基础(二)面向对象(上)

16390
来自专栏python3

python re模块

正则表达式(可以称为REs,regex,regex pattens)是一个小巧的,高度专业化的编程语言,它内嵌于python开发语言中,可通过re模块使用。正则...

13220
来自专栏小灰灰

Java反射的使用姿势一览

反射的学习使用 日常的学习工作中,可能用到反射的地方不太多,但看看一些优秀框架的源码,会发现基本上都离不开反射的使用;因此本篇博文将专注下如何使用 本片博文布...

22860
来自专栏彭湖湾的编程世界

【java】java反射初探 ——“当类也学会照镜子”

反射的作用 开门见山地说说反射的作用 1.为我们提供了全面的分析类信息的能力 2.动态加载类 我理解的“反射”的意义 (仅个人理解哈) 我理解的java反射机制...

273100
来自专栏微信公众号:Java团长

Java反射机制详解

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

9620
来自专栏开发之途

重拾Java(9)-Lambda表达式

12720
来自专栏yl 成长笔记

链表

链表定义:一种递归的数据结构, 它是在集合类的抽象数据,它或者为空, 或者是指向一个节点 (node) 的引用, 该结点含有一个泛型的元素和一个指向另一条链表的...

18510
来自专栏coding for love

JS常用方法整理-遍历对象

JS中经常需要对对象的属性进行遍历,下面我们来总结一下JS遍历对象属性的几种方法。

16220
来自专栏禹都一只猫博客

Pandas文本数据处理 | 轻松玩转Pandas(4)

25520
来自专栏开发之途

重拾Java(5)-枚举

13630

扫码关注云+社区

领取腾讯云代金券