java反射经典题目_JAVA反射练习

本文详细介绍了如何使用Java反射实现通过类名、方法名和参数调用方法,重点讨论了在处理方法重载时遇到的问题及解决方案,包括比较参数类型、判断基本数据类型等技巧,旨在提供一个健壮的反射调用方法的实现。
摘要由CSDN通过智能技术生成

JAVA反射练习

题目

实现一个方法

public static Object execute(String className, String methodName, Object args[])

实现 “通过类的名字、方法名字、方法参数调调用方法,返回值为该方法的返回值。” 的功能。

解题思路

开始阶段

一开始看到这个题目,以为很简单。大致思路就是通过反射获取字节码文件对象,然后该对象获取方法名的方法对象。

将args数组转换成Class对象数组,这样来获取具体的调用某一个方法,最后调用invoke(obj,args)方法完成。

发现问题

按照这个思路写出程序,如下所示:

public static Object execute(String className, String methodName,Object[] args) throws Exception {

// 获取类的字节码文件对象

Class cls = Class.forName(className);

// 获取方法调用的参数的Class对象

Class[] paramsCls = new Class[args.length];

for (int i = 0; i < args.length; i++) {

paramsCls[i] = args[i].getClass();

}

// 获取方法对象

Method method = cls.getMethod(methodName, paramsCls);

Object obj = cls.newInstance();

return method.invoke(obj,args);

}

乍一看,这个程序没有什么太大的问题,可是在测试这个方法时出现了问题,如测试一个public int add(int a,int b)。在传递参数时,是一个Object类型的数组,如20,30这两个参数在传递过去时就被自动的装箱成为了Integer类型。那么获取的Class对象就成为了 class java.lang.Integer,但是add方法的参数却是int类型。

一开始我以为没什么问题,但是在调用cls.getMethod()方法时,出现了问题。虚拟机抛出异常,表示没有这样的方法,这让我很困惑,后来百度了一下,发现int.class和Integer.class并不能混为一谈,也就是这两者并不能像自动拆装箱那样进行转换。也明白了C

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值