java反射之dynamic invocation与原生类型

java反射之dynamic invocation与原生类型

java中的方法参数或者返回值可能为原生类型,反射调用方法的时候,理解在反射invoke方法中如何使用原生类型很重要。
       如果方法的参数为原生类型,involve方法第二个数组参数Object... args传进去的对象如果是封装类型,involve方法会自动“拆箱”为原生类型。

        
/**
 * Using primitives with dynamic invocation
 * 
 * @author sdcuike
 * 
 *         Created At 2016年8月28日 下午5:44:55
 */
public class UsingPrimitivesWithDynamicInvocation {

    public static void main(String[] args) throws ReflectiveOperationException, SecurityException {
        DemoClass demoClass = new DemoClass();
        Method method = demoClass.getClass().getMethod("getAge", new Class[] { int.class });
        Object invoke = method.invoke(demoClass, Integer.valueOf(11));
        System.out.println(invoke.getClass());
    }

    public static class DemoClass {
        public int getAge(int age) {
            return age;
        }
    }

}

上述代码中,我们传入原生类型int的封装类型也是可以的,转换操作是自动“拆箱”操作是自动进行的。

如果返回类型为原生类型,invoke方法在返回结果值的时候会自动进行“装箱””操作,所以,我们必须手动处理原生类型的“拆箱”操作。没有返回值的方法,invoke返回null。



/**
 * Using primitives with dynamic invocation
 * 
 * @author sdcuike
 * 
 *         Created At 2016年8月28日 下午5:44:55
 */
public class UsingPrimitivesWithDynamicInvocation {

    public static void main(String[] args) throws ReflectiveOperationException, SecurityException {
        DemoClass demoClass = new DemoClass();
        Method method = demoClass.getClass().getMethod("getAge", new Class[] { int.class });
        Object invoke = method.invoke(demoClass, Integer.valueOf(11));
        System.out.println(invoke.getClass());// class java.lang.Integer
        int age = ((Integer) invoke).intValue();// 需要手动拆箱操作
        System.out.println(age);

        Method method2 = demoClass.getClass().getMethod("print", new Class[] {});
        Object invoke2 = method2.invoke(demoClass);
        System.out.println(invoke2);// null
    }

    public static class DemoClass {
        public int getAge(int age) {
            return age;
        }

        public void print() {
            System.out.println("==");
        }
    }

}


但是,如果方法的返回值为原生类型数组,反射involve方法不会自动装箱了,而是返回原生类型数组。

/**
 * Using primitives with dynamic invocation
 * 
 * @author sdcuike
 * 
 *         Created At 2016年8月28日 下午5:44:55
 */
public class UsingPrimitivesWithDynamicInvocation {

    public static void main(String[] args) throws ReflectiveOperationException, SecurityException {
        // 自动拆箱操作参数,返回值自动装箱操作
        DemoClass demoClass = new DemoClass();
        Method method = demoClass.getClass().getMethod("getAge", new Class[] { int.class });
        Object invoke = method.invoke(demoClass, Integer.valueOf(11));
        System.out.println(invoke.getClass());// class java.lang.Integer
        int age = ((Integer) invoke).intValue();// 需要手动拆箱操作
        System.out.println(age);

        // 无返回值情况
        Method method2 = demoClass.getClass().getMethod("print", new Class[] {});
        Object invoke2 = method2.invoke(demoClass);
        System.out.println(invoke2);// null

        // 当方法返回原生类型数组的时候,不进行装箱操作
        Method getArray = demoClass.getClass().getMethod("getArray", new Class[] {});
        Object invoke3 = getArray.invoke(demoClass);
        System.out.println(invoke3.getClass());// class [I
        int[] array = (int[]) invoke3;
        for (int i : array) {
            System.out.println(i);
        }

    }

    public static class DemoClass {
        public int getAge(int age) {
            return age;
        }

        public int[] getArray() {
            return new int[] { 11, 66, 88 };
        }

        public void print() {
            System.out.println("==");
        }
    }

}

参考:
java involve方法doc
 

      Java Reflection in Action    1.6.2 Using primitives with dynamic invocation ©2005 by Manning Publications Co



你可能感兴趣的:(java反射之dynamic,invoc)