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反射机制获取类的信息和动态调用方法的示例。以下是对代码的解析和说明:
-
获取类的信息:
通过Class.forName()
方法获取指定类的Class
对象,这里使用的类是co.goho.yuanyu.pojo.Student
。然后使用Class
对象可以获取类中的方法、构造方法和成员变量。 -
获取公开方法:
通过getMethods()
方法获取类中的公开方法,并使用增强的for
循环遍历并打印每个方法的名称。 -
获取构造方法:
通过getConstructors()
方法获取类中的构造方法,并使用增强的for
循环遍历并打印每个构造方法的名称。 -
获取成员变量:
通过getFields()
方法获取类中的公开成员变量,并使用增强的for
循环遍历并打印每个成员变量的名称。若需要获取所有成员变量,包括私有成员变量,可以使用getDeclaredFields()
方法。 -
根据方法名称和参数类型找到特定方法:
使用getConstructor()
方法传入参数类型获取指定的构造方法,并使用getDeclaredMethod()
方法传入方法名称和参数类型获取特定的方法。通过getParameterCount()
方法获取构造方法的参数个数。 -
使用构造方法创建对象:
通过构造方法的newInstance()
方法创建对象,并将其赋值给相应的Object
对象。 -
调用对象的方法:
使用getMethod()
方法传入方法名称和参数类型获取指定方法,然后使用invoke()
方法调用该方法,并传入相应的对象和参数。 -
使用反射获取属性并设置值:
通过getMethod()
方法获取对象的set
方法,然后使用invoke()
方法将相应的值设置给对象的属性。 -
使用反射获取属性并获取值:
通过getMethod()
方法获取对象的get
方法,然后使用invoke()
方法获取对象的属性值。 -
使用反射创建对象并设置属性值:
通过getBean()
方法传入类和属性值的Map
,使用反射创建对象,并使用反射设置属性值。
总结:
本示例展示了Java中使用反射机制获取类的信息、动态调用方法以及设置和获取属性值的过程。反射是一种强大的技术,能够在运行时分析和操作类的行为。它在许多框架和库中被广泛使用,帮助开发人员实现灵活和可扩展的代码。
这就是本篇博客的全部内容!希望通过阅读了解了Java反射机制的基本概念和用法。如果您有任何进一步的问题,请随时提问。