美文网首页
Java 反射中一个有趣的坑

Java 反射中一个有趣的坑

作者: Little丶Jerry | 来源:发表于2019-01-02 00:18 被阅读0次
问:下面程序段注释部分运行结果分别是什么?为什么?
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
    }
}

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

int age=27
int age=28
Integer age=27
Integer 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;

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

Class clzss = int[].class; //int[] 数组
Class clzss = String[].class; //String[] 数组
Class clzss = String[][].class; //String[][] 数组的数组

所以在使用时请务必小心留意这些容易掉坑的细节。

本文参考自 解析 Java 反射题中一个有趣的坑

相关文章

  • Java 反射中一个有趣的坑

    问:下面程序段注释部分运行结果分别是什么?为什么? 答:上面程序的运行结果如下。 因为在反射中基本类型的 clas...

  • 深入理解Java虚拟机三

    一、Java反射的实现原理 1.反射调用的实现 反射是Java语言中一个相当重要的特性,它允许正在运行的Ja...

  • 深入java反射

    概念:反射(Reflection)是Java 程序开发语言的特征之一,反射也是java中一种强大的工具,能够使我们...

  • Java 反射机制

    Java 反射机制 什么是反射 Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”。 ...

  • java 反射基础

    1.java反射基础 2.java反射进阶 反射的两个显著的作用 反编译: .class —> .java 通过...

  • 博客地址

    java注解-01、java注解-02、Git面试资源java反射-01、java反射-02、java反射-03为...

  • JVM深度剖析:JVM是如何实现反射的?

    反射是 Java 语言中一个相当重要的特性,它允许正在运行的 Java 程序观测,甚至是修改程序的动态行为。 举例...

  • Java反射机制入门

    Java反射机制入门 一、什么是反射 JAVA反射机制(The JAVA reflection mechanism...

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

网友评论

      本文标题:Java 反射中一个有趣的坑

      本文链接:https://www.haomeiwen.com/subject/olhalqtx.html