Java 反射基本数据类型

问:下面程序段注释部分运行结果分别是什么?为什么?
public class Test {
    public void age(int age) {
        System.out.println("int age="+age);
    }
    public void age(Integer age) {
        System.out.println("Integer age="+age);
    }
    public static void main(String[] args) throws Exception {
        Test obj = new Test();
        Method m1 = obj.getClass().getMethod("age", int.class);
        m1.invoke(obj, new Integer(27));  //1
        m1.invoke(obj, 28); //2

        Method m2 = obj.getClass().getMethod("age", Integer.class);
        m2.invoke(obj, new Integer(27));  //3
        m2.invoke(obj, 28); //4

        Method m3 = obj.getClass().getMethod("age", Integer.TYPE);
        m3.invoke(obj, new Integer(27));  //5
        m3.invoke(obj, 28); //6
    }
}

答:上面程序的运行结果如下。

int age=27
int age=28
Integer age=27
Integer age=28
int age=27
int age=28

因为在反射中基本类型的 class 和其对应包装类的 class 是不同的,所以在获得 Method 指定参数时需要精确指定参数的类型,即基本类型参数 int 是无法使用包装类型 Integer 来获得的,在 Java 反射中一定要注意这个问题。

这个问题中想反射调用基本类型参数方法除了可以通过 基本类型名.class 外还可以通过 对应包装类的静态字段 TYPE 获得,即通过调用 getMethod("age", Integer.TYPE).invoke(27); 来实现反射 int 类型的 age 方法,因为 int.class 等价于 Integer.TYPE

该问题的本质其实是因为 Java 中一切皆对象,而基本数据类型没有类的全限定名且没有 getClass 方法可供使用,所以如果想用 Class 类来表示基本数据类型的 Class 实例就得使用 Java 提供的内置实例,即:

Class clzss = byte.class;
Class clzss = short.class;
Class clzss = int.class;
Class clzss = long.class;
Class clzss = char.class;
Class clzss = float.class;
Class clzss = double.class;
Class clzss = boolean.class;
Class clzss = void.class;

此外 Java 的基本数据类型的包装类中都有一个名为 TYPE 的常量来表示对应包装类型的基本数据类型的 Class 实例,即:

Byte.TYPE = byte.class;
Short.TYPE = short.class;
Integer.TYPE = int.class;
Long.TYPE = long.class;
Char.TYPE = char.class;
Float.TYPE = float.class;
Double.TYPE = double.class;
Boolean.TYPE = boolean.class;
Void.TYPE = void.class;

结论:包装类.TYPE = 基本数据类型.class

同理对于数组类型的 Class 类型实例也是类似规则,譬如:

Class clzss = int[].class; //int[] 数组
Class clzss = String[].class; //String[] 数组
Class clzss = String[][].class; //String[][] 数组的数组
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,094评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,248评论 18 399
  • 大年初四晚上,做梦梦着你了。大概是想你想疯了,梦着你跟踪我回家了,梦里好高兴快疯了,醒来发现不过一场空梦而已。...
    沉寂如斯阅读 2,425评论 0 0
  • Java集合中有一个Stack的类,这个类基于Vector集合实现,但是效率较低。ArrayDeque在官方文档中...
    zhanglbjames阅读 3,616评论 0 4
  • 我还是喜欢用笔去书写文字,或者说习惯,亦或者说是青春时留下的毛病。 如果仔细翻阅记忆,抽中其中一本,抹去上面所蒙的...
    DoAsInfinity阅读 3,304评论 3 2

友情链接更多精彩内容