JAVA反射

反射是为了解决不知道这个类的构造的情况下,想要对这个类进行操作,所必须的。看以下代码:

Method get = bean.getClass().getMethod( ClassUtils.getClassGetName(patch[2]));
            Method set = bean.getClass().getMethod( ClassUtils.getClassSetName(patch[2]),get.getReturnType());
            Object oldv = get.invoke(bean);
            if(get.getReturnType().getSimpleName().equals("String")){
                set.invoke( bean, nval);
            }else{
                set.invoke( bean, Integer.valueOf(nval));
            }

其中getMethod方法和invoke方法需要注意

public Object invoke(Object obj,Object[] args) throws IllegalAccessException, IllegalArgumentException,InvocationTargetException

参数obj 代表的是对应类的实例,参数args对应的是此方法中要求的形参类型,注意obj必须是个实例,否则你去改变它的值毫无意义

public Method getMethod(String name, Class[] parameterTypes) throws NoSuchMethodException, SecurityException

参数name是你的方法的名字,parameterTypes是形参类型,如果没有参数,当然可以为空。至于为什么还要指定参数类型不做解释,这些个类型都是在包java.lang.reflect里面的。下面这段代码是我从网上搜索到的,写的比较详细,地址记不清楚了。

public static void printMethods(Class cl)
    {
        Method[] methods =cl.getDeclaredMethods();//返回一个包含方法对象的数组
        for(Method m : methods)//循环该类的每个方法
        {
        Class retType = m.getReturnType();//该方法的返回类型,
        String name = m.getName();//获得方法名
        System.out.print(" "+Modifier.toString(m.getModifiers()));//打印方法修饰符
        System.out.print(" "+retType.getName() + " " + name +"(");
    
        Class[] paramTypes = m.getParameterTypes();//获得一个方法参数数组(getparameterTypes用于返回一个描述参数类型的Class对象数组)
    
        for(int j = 0 ; j < paramTypes.length ; j++)
    
        {
        if ( j > 0 ) System.out.print(" , ");   //如果有多个参数,中间则用逗号隔开,否则直接打印参数
        System.out.print (paramTypes[ j ].getName());
        }
        System.out.println (" );");
        }
    }

你可能感兴趣的:(java,反射,invoke,GetMethod)