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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 通过反射怎么获取方法中参数值相关的知识,希望对你有一定的参考价值。

参考技术A 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下的一个方法的方法。应该对你有所帮助!

如何通过java 反射 调用一个 含有 可变参数的 方法呢 ??

比如说 public void test(String ... str) .........public static void main(String[] args) //我该 如何实现呢

java反射调用可变参数的方法的方式是传入objects参数,如下代码:

public class Reflect 
 
    public static void main(String[] args) throws Exception 
        Class<?> clazz = Single.class;
        Single single = (Single) clazz.newInstance();
        List<String> list = new ArrayList<String>()
            private static final long serialVersionUID = 1L;
            
                add("fuck");
                add("ni");
                add("mei");
            
        ;
         
        //获取method两种方式, 在method中 数组的的空间大小是可以随便写的不一定使用0
        /* 1 */
        Method method = clazz.getDeclaredMethod("method", Array.newInstance(Object.class, 0).getClass());
        /* 2 */
        method = clazz.getDeclaredMethod("method", (new Object[0]).getClass());
 
 
         
        //初始化参数
        /* 1 */
        Object objs = Array.newInstance(Object.class, 2);
        Array.set(objs, 0, list);
        Array.set(objs, 1, "23");
        method.invoke(single, objs);
         
        /* 2 */
        Object[] objects = 1, "fuck", list;
        method.invoke(single, new Object[] objects );
    

 
class Single 
    public void method(Object... objs) 
        System.out.println(Arrays.deepToString(objs));
    

 
结果:
[[fuck, ni, mei], 23]
[1, fuck, [fuck, ni, mei]]
参考技术A package com.zxq.test;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test

public void test (String...args)
System.out.println(args.length);//输出可变参数的长度


/**
* @param args
*/
public static void main(String[] args)
try
Object o = Class.forName("com.zxq.test.Test").newInstance();//获取Test类的实例
Method test = o.getClass().getMethod("test", String[].class);//获取test方法,String...args就是一个数组类型,所以用String[].class
String[] methodArgs = new String[3];//定义test的实参
Object[] arguments = methodArgs;//要传递的参数。因为test方法只需要一个数组参数,所以只能传一个methodArgs,但是methodArgs可以有多个元素,因为它是可变参数
test.invoke(o, arguments);//调用
catch (SecurityException e)
e.printStackTrace();
catch (NoSuchMethodException e)
e.printStackTrace();
catch (InstantiationException e)
e.printStackTrace();
catch (IllegalAccessException e)
e.printStackTrace();
catch (ClassNotFoundException e)
e.printStackTrace();
catch (IllegalArgumentException e)
e.printStackTrace();
catch (InvocationTargetException e)
e.printStackTrace();






//结果:3
参考技术B Class class = obj.getClass();
Method mtd= class .getDeclaredMethod("方法名称");
mtd.invok(obj,你需要设定的参数);
说明:如果调用的方法中使用了可变参数,你在实际执行该方法时候指定相应的参数即可。

以上是关于java 通过反射怎么获取方法中参数值的主要内容,如果未能解决你的问题,请参考以下文章

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

java怎么获取方法参数名

Java反射机制获取set()方法 并且为set()方法传值

如何通过java 反射 调用一个 含有 可变参数的 方法呢 ??

JAVA反射问题,一个方法类的参数能否通过设置成泛型或者啥来接收反射的CLASS。

在JAVA中,怎么利用反射获取一个方法?