首页 新闻 会员 周边

java 通过反射怎么获取方法中参数值

0
悬赏园豆:10 [已解决问题] 解决于 2014-06-27 22:18
public Userinfo findById(String id){}例如我有上面的一个方法 我现在通过反射已经得到了参数名 也就是得到了参数类型是java.util.String 但我现在要获取到id这个值应该怎么获取
上面的代码是一个接口的实现类 我已经在一个类中调用了这个接口并传入了id值但我现在想做的功能是通过java反射在这个接口的实现类里做一些逻辑处理 现在我通过反射已经获取该接口实现类的方法名及方法参数类型但不知道如何获取传过来的这个id值 我要通过这个不通的id值做不同的业务处理
asdfsdfsdf的主页 asdfsdfsdf | 初学一级 | 园豆:193
提问于:2014-06-27 08:59
< >
分享
最佳答案
0

 我觉得你的理解有些偏差,反射可以拿到一个对象的成员变量的值,但方法的参数是出现在方法被调用的时候,你拿到了class,method,参数类型等这些都没用,这些都是静态的,固定的,你应该从代理的方向去思考,比如说自己写代理类,把目标对象包装起来,或者是使用动态代理。你的描述也不够详细,我不清楚你的具体场景,也只能说这么多了,要不你再补充下吧

收获园豆:7
trytocatch | 菜鸟二级 |园豆:373 | 2014-06-27 18:11

谢了 我现在知道了 单纯的用反射是获取不到参数值的 我现在已经用cglib实现了这个功能

asdfsdfsdf | 园豆:193 (初学一级) | 2014-06-27 22:18
其他回答(1)
0
public <T> T invokeMethod(String beanName, String methodName,
            Class<?>[] paramTypes, Object... parameters) {
        try {
            Object bean = ApplicationContextHolder.getBean(beanName);
            Class<? extends Object> beanClass = bean.getClass();
            // Method method = beanClass.getDeclaredMethod(methodName,
            // paramTypes);
            // Method m0 = ClassUtils.getPublicMethod(beanClass, beanName,
            // paramTypes);

            Method method = null;
            Method[] ms = beanClass.getMethods();
            for (Method m : ms) {
                String mName = m.getName();
                if (StringUtils.equals(methodName, mName)) {
                    boolean isThis = true;
                    Class<?>[] pt = m.getParameterTypes();
                    if (paramTypes.length == pt.length) {
                        int plength = paramTypes.length;
                        if (plength == 0) {
                            isThis = true;
                        } else {
                            for (int i = 0; i < plength; i++) {
                                boolean ff = pt[i]
                                        .isAssignableFrom(paramTypes[i]);
                                if (!ff) {
                                    isThis = false;
                                    break;
                                }
                            }
                        }
                    } else {
                        isThis = false;
                    }
                    if (isThis) {
                        method = m;
                        break;
                    }
                }
            }
            if (method == null) {
                throw new NoSuchMethodException(beanName + "." + methodName);
            }

            Object obj = null;
            if (parameters == null || parameters.length < 1) {
                obj = method.invoke(bean);
            } else {
                obj = method.invoke(bean, parameters);
            }
            T out = (T) obj;
            return out;
        } catch (SecurityException e) {
            log.error(DataTypeConstant.MOD_CODE_SUBTYPE2, "", e);
        } catch (IllegalArgumentException e) {
            log.error(DataTypeConstant.MOD_CODE_SUBTYPE2, "", e);
        } catch (IllegalAccessException e) {
            log.error(DataTypeConstant.MOD_CODE_SUBTYPE2, "", e);
        } catch (InvocationTargetException e) {
            log.error(DataTypeConstant.MOD_CODE_SUBTYPE2, "", e);
        } catch (NoSuchMethodException e) {
            log.error(DataTypeConstant.MOD_CODE_SUBTYPE2, "", e);
        }
        return null;
    }

上面是一个完整的通过bean的名称和方法名称来调用该bean下的一个方法的方法。应该对你有所帮助!

收获园豆:3
telang | 园豆:646 (小虾三级) | 2014-06-27 11:30

谢了

支持(0) 反对(0) asdfsdfsdf | 园豆:193 (初学一级) | 2014-06-27 22:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册