java反射getmethod用法_java反射-使用反射来操纵方法

一个类的主要成员时方法,辣么我们通过反射获取到一个类的所有方法信息后,总的寻找一种方式去操作调用这些方法,这样反射才有意义有意思。

Method对象有一个方法invoke。      public Object invoke(Object obj, Object... args) throws IllegalAccessException,IllegalArgumentException,InvocationTargetException。    该方法的解释API解释为:

对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。

如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。

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

如果底层方法是实例方法,则使用动态方法查找来调用它,这一点记录在 Java Language Specification, Second Edition 的第 15.12.4.4 节中;在发生基于目标对象的运行时类型的重写时更应该这样做。

如果底层方法是静态的,并且尚未初始化声明此方法的类,则会将其初始化。

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

下面我用ArrayList 类来做了一个测试:

importjava.lang.annotation.Annotation;importjava.lang.reflect.Constructor;importjava.lang.reflect.Field;importjava.lang.reflect.Method;importjava.lang.reflect.Parameter;importjava.util.ArrayList;/*** java反射 工具类*/

public classClassUtil {/*** 通过反射操作对象方法*/

public static voidmethod() {try{//本例中传入的是ArrayList 对象,就以ArrayList 对象的add方法为例

ArrayList arrayList = newArrayList();//1.获取该类的类类型

Class c =arrayList.getClass();//2.获取该类自己定义的所有方法

Method[] methods =c.getDeclaredMethods();//3.得到所有方法列表信息

for(Method method : methods) {

System.out.print(method.getName()+ "(");

Class[] parameterTypes=method.getParameterTypes();for (int i = 0, len = parameterTypes.length; i < len; i++) {

System.out.print(parameterTypes[i].getName());if (i != len - 1) {

System.out.print(",");

}

}

System.out.print(")n");

}//4.使用方法 invoke 来操作方法 add

Method method = c.getMethod("add", new Class[]{Object.class});

method.invoke(arrayList,"测试1");

method.invoke(arrayList,100);

method.invoke(arrayList,100.0f);//5.测试打印 arrayList 对象

System.out.println("================" +arrayList);

}catch(Exception e) {

e.printStackTrace();

}

}public static voidmain(String[] args) {

ClassUtil.method();

}

}

对于java集合中的泛型,是用于在编译阶段程序员输入验证的,我们可以通过反射的方式,来绕过这种输入验证。如上面的栗子,我们将 ArrayList arrayList = new ArrayList();指定泛型为String类型,其他代码不变,你会发现,打印输出的结果还是一样。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值