关闭

java反射之dynamic invocation与原生类型

标签: java反射之dynamic invoc
1018人阅读 评论(0) 收藏 举报
分类:

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



1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

拦截器(Interceptor)中的invocation.invoke()是什么意思?

关于在Struts2的自定义的验证拦截器(Interceptor)中的invocation.invoke()是什么意思? package com.xjtu.interceptor; imp...
  • canlets
  • canlets
  • 2013-08-16 16:08
  • 9178

Java反射异常处理之InvocationTargetException

InvocationTargetException异常由Method.invoke(obj, args...)方法抛出
  • zhangzeyuaaa
  • zhangzeyuaaa
  • 2014-09-27 14:27
  • 187150

cButtonXP类

Option ExplicitPrivate m_hWnd      As LongPrivate m_Hdc       As LongPrivate m_Enabled ...
  • xp8977606
  • xp8977606
  • 2006-10-25 10:50
  • 469

玩转java(2)— 泛型type体系与反射

一、Type类型 Type是Java编程语言中所有类型的普通的父接口。这些类型包括原生类型(raw types),参数化类型(parameterized types),数组类型(array types...
  • qbg19881206
  • qbg19881206
  • 2014-04-01 23:04
  • 6658

深入理解Java类型信息(Class对象)与反射机制

【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/70768369 出自【...
  • javazejian
  • javazejian
  • 2017-05-01 23:19
  • 20160

java反射之dynamic invocation与原生类型

java反射之dynamic invocation与原生类型 java中的方法参数或者返回值可能为原生类型,反射调用方法的时候,理解在反射invoke方法中如何使用原生类型很重要。        ...
  • doctor_who2004
  • doctor_who2004
  • 2016-08-28 18:15
  • 1018

玩转java(2)— 泛型type体系与反射

一、Type类型 Type是Java编程语言中所有类型的普通的父接口。这些类型包括原生类型(raw types),参数化类型(parameterized types),数组类型(array types...
  • qbg19881206
  • qbg19881206
  • 2014-04-01 23:04
  • 6658

【类反射】类反射原理和获取Class对象的三种方式

什么是类反射?☆什么是反射Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法...
  • qq_35415600
  • qq_35415600
  • 2017-04-17 00:07
  • 2084

Struts 2 Security Vulnerability - Dynamic Method Invocation

Introduction The Struts 2 web application framework has a long-standing security vulnerability that...
  • cnbird2008
  • cnbird2008
  • 2012-02-15 22:55
  • 1400

RMI 简单示例-Java Remote Methods Invocation

  • 2009-09-14 16:49
  • 9KB
  • 下载
    个人资料
    • 访问:675864次
    • 积分:9254
    • 等级:
    • 排名:第2320名
    • 原创:253篇
    • 转载:182篇
    • 译文:9篇
    • 评论:67条
    博客专栏
    博客链接