调用 method.invoke(Object target, Object... args) 方法的方式出错:传入参数个数错误。

我想自动执行某一对象的所有 getters 方法,但又不想手动调用,所以利用反射,写了工具方法:

    // 执行某对象的所有getters方法
    public static void invokeGetters(Object obj) {
        Class clazz = obj.getClass();
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            if (method.getName().matches("get.*")) {
                try {
                    System.out.println(method.getName() + " = " + method.invoke(obj));
                    // java.lang.IllegalArgumentException: wrong number of arguments
                } catch (Exception e) {
                    // e.printStackTrace();

但报错。
原因:有些方法,如 request.getHeaders(String s)需要传入参数。
那么需要传入参数的getters就不管了(参数个数不为0的getters就不执行)。
判断flag变为:method.getName().matches("get.*") && 0 == method.getParameterCount()
即:方法名匹配get.*模式 且 方法的参数个数为0。才会调用method.invoke(obj)

  • 修改后的工具方法
public static void invokeGetters(Object obj) {
    Class clazz = obj.getClass();
    Method[] methods = clazz.getDeclaredMethods();
    for (Method method : methods) {
        if (method.getName().matches("get.*") && 0 == method.getParameterCount()) {
            try {
                System.out.println(method.getName() + " = " + method.invoke(obj));
            } catch (Exception e) {
                // e.printStackTrace();
类Target.java有一个execute()方法,用一个String数组作为参数
public class Target {
    public void execute(String[] args) {
        System.out.println("call execute method with parameter type String[]");
					
java.lang.IllegalArgumentException: Invalid value type for attribute ‘factoryBeanObjectType‘解决方案
今天在写一个反射的例子的时候,遇到了java.lang.IllegalArgumentException: wrong number of arguments这个错误,后来看了源代码,才知道错误的原因,一个很低级的错误; 首先我的代码是这样写的:在我的jpa栏中注解的那块代码中: public void parse(Object obj, String methodName,String c
报错原因:非法参数(参数个数错误)IllegalArgumentException: wrong number of arguments 这个错误也算是比较常见了,但是应该没有人这样使用! 由于需求是: 将为“”(空字符串)的属性值设置为:null 所以调用invoke方法时,直接传入参数null导致报错 解决方法: 构造一个与该属性类型一致的变量传入即可 例如:字段类型是java.lang.S...
,这几天都忙于给学员加强java基础. 在忙于授课的同时,把今天学员遇到的第一个关于反射的bug:java.lang.IllegalArgumentException: wrong number of argumen...
当你使用Swing容器时JFrame时且布局是CardLayout时,当报出此错误时,说明在更换卡片时,直接对窗体进行了操作,而窗体是不能直接更换的,被跟换的是窗体中的JPanel,所以只需要在窗体的位置加上.getContentPane()即可解决问题。 CardLayout cl = new CardLayout(); //新建一个卡片式布局对象 this.setLayout(cl); //将窗体设置为卡片式布局 //cl.show(this,"2"); //错误示范 cl.show(this.
这几天也没事干, 玩一玩Java的反射机制, 第一天玩这个, 没想到就遇到了一个Exception, 好高兴啊! 虽然网上也有许多这方面的异常, 我看自己还是整理一下吧! /** 一个简单的实体类 */ public class User { private int id; private String name; private boolean flag; /** 写三个构造方法,
在用反射调用Hello.java的main方法时报了一个异常 java.lang.IllegalArgumentException: wrong number of argumentspackage classloader; public class Hello{ public static void main(String args[]){ for(String arg:
public List<User> selectUsers(Integer role, PageSort page) { log.info("批量查询用户信息,查询的角色权限:" + role); List<User> usersList = new ArrayList<User>(); int offset = (page.getPageNum() - 1) * page.getPageSize(); int limit = page.getPageSize(); RowBounds rowBounds = new RowBounds(offset, limit); List<User> userList = userInfoMapper.selectByRoleAndPage(role, rowBounds); return usersList; } @SelectProvider(type = UserSqlProvider.class, method = "selectByRoleAndPage") List<User> selectByRoleAndPage(@Param("role") Integer role, RowBounds rowBounds); public class UserSqlProvider { public String selectByRoleAndPage(Integer role, RowBounds rowBounds) { String sql = "SELECT * FROM user WHERE 1=1"; if (role != -1) { sql += " AND role = #{0}"; } sql += " LIMIT #{1.offset}, #{1.limit}"; return sql; } } 报错Error invoking SqlProvider method (com.ruifan.taihaolian.biz.mapper.provider.UserSqlProvider.selectByRoleAndPage). Cause: java.lang.IllegalArgumentException: wrong number of arguments
java方法中只有一个参数是数组,反射的时候我们不能想当然的传歌数组进去,传数组进去的时候表示多个参数。 两个数组不是一个意思啊。 我们应该把数组转为objet,这样才表示一个参数。 import java.lang.reflect.Method; public class MethodTest { public void a(String[] args) { Sys...