• 解析 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
        }
    }
    View Code

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

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

     

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

    2  int.class 等价于 Integer.TYPE:

    例子:
    Integer.TYPE 返回
    public static final Class<Integer> TYPE = (Class<Integer>) Class.getPrimitiveClass("int");

    该问题的本质其实是因为 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;
  • 相关阅读:
    PPTP服务器的端口
    Linux ln命令
    Git 学习笔记回到过去版本
    Iptables中SNAT和MASQUERADE的区别
    转移虚拟机后ubuntu network available SIOCSIFADDR: No such device
    用iptables做IP的静态映射
    软件项目管理
    需求工程
    软件工程——理论、方法与实践 之 软件实现
    软件工程——理论、方法与实践 之 软件工程中的形式化方法
  • 原文地址:https://www.cnblogs.com/eryun/p/9992401.html
Copyright © 2020-2023  润新知