使用Java反射机制获取类的信息和动态调用方法的示例

try {
            //获得Student类的class对象
            Class c=Class.forName("co.goho.yuanyu.pojo.Student");
            //获得Student类中所有的公开方法,返回一个方法数组
            Method[]methods=c.getMethods();
            for (Method m: methods) {
                System.out.println(m.getName());
            }

            //获得Student类的构造方法
            Constructor [] constructors=c.getConstructors();
            for (Constructor ctt:constructors
                 ) {
                System.out.println(ctt.getName());
            }

            //获得Student类中的成员变量
            Field[]fields=c.getFields();
            for (Field field:
                 fields) {
                System.out.println(field.getName());
            }

            Field[]fields1=c.getDeclaredFields();
            for (Field field:fields1
                 ) {
                System.out.println(field.getName());
            }

            //根据方法名称和参数类型,找到特定的方法
            Constructor noArgsCOnst= c.getConstructor(null);
            System.out.println(noArgsCOnst.getParameterCount());

            //使用class对象获得构造方法,并且使用构造方法创建对象
            Constructor ctt0=c.getConstructor(null);
            Object o0=ctt0.newInstance();
            System.out.println(o0);

            //调用有参构造
            Constructor ctt2=c.getConstructor(int.class,String.class,float.class);
            Object o1=ctt2.newInstance(1,"张三",3.8f);
            System.out.println(o1);


            //o0对象只有初始化属性,显示 3,"李四" 200
            //找到对象的三个set
            Method a=c.getMethod("setId",int.class);
            Method b=c.getMethod("setName",String.class);
            Method d=c.getMethod("setBalance",float.class);

            a.invoke(o0,3);
            b.invoke(o0,"李四");
            d.invoke(o0,200f);
            System.out.println(o0);

        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }

        Map<String,Object>map=new HashMap<String,Object>();
        map.put("id",4);
        map.put("name","王五");
        map.put("balance",3.89);

        Student s=getBean(Student.class,map);
    }

在上述代码中,展示了使用Java反射机制获取类的信息和动态调用方法的示例。以下是对代码的解析和说明:

  1. 获取类的信息:
    通过Class.forName()方法获取指定类的Class对象,这里使用的类是co.goho.yuanyu.pojo.Student。然后使用Class对象可以获取类中的方法、构造方法和成员变量。

  2. 获取公开方法:
    通过getMethods()方法获取类中的公开方法,并使用增强的for循环遍历并打印每个方法的名称。

  3. 获取构造方法:
    通过getConstructors()方法获取类中的构造方法,并使用增强的for循环遍历并打印每个构造方法的名称。

  4. 获取成员变量:
    通过getFields()方法获取类中的公开成员变量,并使用增强的for循环遍历并打印每个成员变量的名称。若需要获取所有成员变量,包括私有成员变量,可以使用getDeclaredFields()方法。

  5. 根据方法名称和参数类型找到特定方法:
    使用getConstructor()方法传入参数类型获取指定的构造方法,并使用getDeclaredMethod()方法传入方法名称和参数类型获取特定的方法。通过getParameterCount()方法获取构造方法的参数个数。

  6. 使用构造方法创建对象:
    通过构造方法的newInstance()方法创建对象,并将其赋值给相应的Object对象。

  7. 调用对象的方法:
    使用getMethod()方法传入方法名称和参数类型获取指定方法,然后使用invoke()方法调用该方法,并传入相应的对象和参数。

  8. 使用反射获取属性并设置值:
    通过getMethod()方法获取对象的set方法,然后使用invoke()方法将相应的值设置给对象的属性。

  9. 使用反射获取属性并获取值:
    通过getMethod()方法获取对象的get方法,然后使用invoke()方法获取对象的属性值。

  10. 使用反射创建对象并设置属性值:
    通过getBean()方法传入类和属性值的Map,使用反射创建对象,并使用反射设置属性值。

总结:
本示例展示了Java中使用反射机制获取类的信息、动态调用方法以及设置和获取属性值的过程。反射是一种强大的技术,能够在运行时分析和操作类的行为。它在许多框架和库中被广泛使用,帮助开发人员实现灵活和可扩展的代码。

这就是本篇博客的全部内容!希望通过阅读了解了Java反射机制的基本概念和用法。如果您有任何进一步的问题,请随时提问。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值