Java反射Reflect的使用详解(3)

输出结果为:

直接打印 public java.lang.String reflectdemo.SuperHero.getName() 手动构建 String getName() 直接打印 public void reflectdemo.SuperHero.setName(java.lang.String) 手动构建 void setName(String) 5.2 getDeclaredMethods() public class ClassUtils { /** * 遍历方法 * @param clazz */ public static void getDeclaredMethods(Class clazz){ //获取类中所有声明的方法 Method[] methods = clazz.getDeclaredMethods(); for (Method method : methods){ System.out.println(method); } } } public class ClassTest { public static void main(String[] args) { try { Class clazz = Class.forName("reflectdemo.SuperHero"); //遍历方法 ClassUtils.getDeclaredMethods(clazz); } catch (Exception e) { e.printStackTrace(); } } }

输出结果为:

public java.lang.String reflectdemo.SuperHero.getName() public java.lang.String reflectdemo.SuperHero.getId() public void reflectdemo.SuperHero.setName(java.lang.String) public void reflectdemo.SuperHero.print() public java.lang.String reflectdemo.SuperHero.getSkill() public void reflectdemo.SuperHero.setAge(java.lang.Integer) public void reflectdemo.SuperHero.setSkill(java.lang.String) public void reflectdemo.SuperHero.setId(java.lang.String) public java.lang.Integer reflectdemo.SuperHero.getAge() 5.3 方法执行 public class ClassUtils { /** * 执行set方法(通过Method的invoke方法) * @param o 待执行的实体 * @param methodName 方法名称 * @param params 方法参数类型 * @throws Exception */ public static void invokeSetMethod(Object o, String methodName, Class[] params) throws Exception { Method method = o.getClass().getDeclaredMethod(methodName, params); method.invoke(o, "钢铁侠"); } /** * 执行get方法(通过Method的invoke方法) * @param o 待执行的实体 * @param methodName 方法名称 * @throws Exception */ public static void invokeGetMethod(Object o, String methodName) throws Exception{ Method method = o.getClass().getDeclaredMethod(methodName); Object obj = method.invoke(o); System.out.println(obj); } } public class ClassTest { public static void main(String[] args) { try { Class clazz = Class.forName("reflectdemo.SuperHero"); //创建实体 Object o = clazz.newInstance(); //调用set方法 ClassUtils.invokeSetMethod(o, "setName", new Class[]{String.class}); //调用get方法 ClassUtils.invokeGetMethod(o, "getName"); } catch (Exception e) { e.printStackTrace(); } } }

输出结果为:

钢铁侠

下面是对invoke方法的API说明

public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException

在具有指定参数的方法对象上调用此方法对象表示的基础方法。

如果底层方法是静态的,则指定的obj参数将被忽略。 它可能为null。

如果底层方法所需的形式参数的数量为0,则提供的args数组的长度为0或为空。

如果底层方法是一个实例方法,它将使用动态方法查找来调用,如“Java语言规范”第二版,第15.12.4.4节所述; 特别是将会发生基于目标对象的运行时类型的覆盖。

如果底层方法是静态的,则如果尚未初始化该方法,那么声明该方法的类将被初始化。

如果方法正常完成,则返回的值将返回给调用者; 如果值具有原始类型,则首先将其适当地包装在对象中。 但是,如果该值具有基本类型的数组的类型,则该数组的元素不会包含在对象中; 换句话说,返回一个原始类型的数组。 如果底层方法返回类型为void,则调用返回null。

参数

obj - 从底层方法被调用的对象

args - 用于方法调用的参数

结果

由该对象表示的方法在 obj上调用 args

异常

IllegalAccessException - 如果这个 方法对象正在强制执行Java语言访问控制,并且底层方法是无法访问的。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/0fcca08088d0daaf191bc2145350ae92.html