您的位置 首页 java

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 }} 

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

int age=27int age=28Integer 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高级编程——反射之基本数据类型相关踩坑笔试题

文章地址:https://www.zhihuclub.com/184568.shtml

关于作者: 智云科技

热门文章

网站地图