java反射之dynamic invocation与原生类型

原创 2016年08月28日 18:15:47

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



版权声明:本文为博主原创文章,未经博主允许不得转载[http://blog.csdn.net/doctor_who2004]。

相关文章推荐

Java进阶之reflection(反射机制)——反射概念与基础

这里写链接内容  反射机制是Java动态性之一,而说到动态性首先得了解动态语言。那么何为动态语言?一、动态语言动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的...
  • xu__cg
  • xu__cg
  • 2016-10-20 22:00
  • 2060

java基础之继承和多态概念

java基础之继承和多态概念 Inheritance Inheritance is a reusability mechanism in object-oriented programming....

Java反射机制的基本概念与使用

本篇文章分为以下几个部分: 1.认识反射 2.利用反射操作构造方法 3.利用反射调用类中的方法 4.反射中的invoke方法 5.利用反射调用类中的属性 反射在我们普通程序开发中基本使用不到,但是在我...

java反射基本概念

java反射基本概念 1.java反射入口    在java程序中,任何对象都有其对应的Class,而Class是通向java反射的一道大门。 在java中获取Class有两种方式:1.通过对象...

java7新特性之Try-with-resources (TWR)

java7新特性之Try-with-resources (TWR) This change is easy to explain, but it has proved to have hidden...

经常逛的IT博客--持续更新ing.......

博客收藏

java并发基础之The volatile keyword

java并发基础之The volatile keyword Why synchronized? One of the biggest changes in concurrent pro...

struts2的ActionInvocation分析(action调度者)

一个ActionInvocation实例代表一个action的执行状态,持有拦截器和将要执行的action的实例。 defaultActionInvocation是其默认实现。下面是定义在该类中的部分...

struts2 拦截器和actioninvocation

Interceptor说明 Interceptor的接口定义没有什么特别的地方,除了init和destory方法以外,intercept方法是实现整个拦截器机制的核心方法。而它所依赖的参数Act...

java中InvocationHandler 用于实现代理。

InvocationHandler 用于实现代理。 如果不用InvocationHandler接口实现代理的话,我们写代码是这样的: 定义一个接口:Java code
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)