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)); //
m1.invoke(obj, 28); // Method m2 = obj.getClass().getMethod("age", Integer.class);
m2.invoke(obj, new Integer(27)); //
m2.invoke(obj, 28); //
}
}

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

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;

解析 Java 反射题中一个有趣的坑的更多相关文章

  1. 深入解析Java反射(1) - 基础

    深入解析Java反射(1) - 基础 最近正筹备Samsara框架的开发,而其中的IOC部分非常依靠反射,因此趁这个机会来总结一下关于Java反射的一些知识.本篇为基本篇,基于JDK 1.8. 一.回 ...

  2. dubbo debug过程中一个有趣的问题

    最近在debug dubbo代码过程中遇到的很有趣的问题 我们都知道dubbo ReferenceBean是消费者的spring bean包装,为了查一个consumer端的问题,在Reference ...

  3. 深入解析Java反射-invoke方法

    博客原文:http://www.sczyh30.com/posts/Java/java-reflection-2/ 上篇文章中回顾了一下Java反射相关的基础内容.这一节我们来深入研究Method类中 ...

  4. 深入解析Java反射基础

    博客原文:http://www.sczyh30.com/posts/Java/java-reflection-1/ - 这老哥写的特别好 一.回顾:什么是反射? 反射(Reflection)是Java ...

  5. 深入解析Java反射

    因为本人最近正筹备Samsara框架的开发,而其中的IOC部分非常依靠反射,因此趁这个机会来总结一下关于Java反射的一些知识.本篇为基本篇,基于JDK 1.8. 一.回顾:什么是反射? 反射(Ref ...

  6. 基础篇:深入解析JAVA反射机制

    目录 反射的概念 获取Class的三种方法 JAVA反射API 反射机制应用的场景 反射和JDK动态代理 欢迎指正文中错误 关注公众号,一起交流 参考文章 反射的概念 java的放射机制:在程序运行时 ...

  7. Java反射:new一个宝可梦吧

    最近写Spring Boot的测试用例会发现经常会有用到@RunWith(SpringRunner.class)的设置注解,关于SpringRunner.class的理解也有点似是而非.其实这种写法是 ...

  8. Java编程题: 写一个Singleton出来

    Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 一般Singleton模式通常有几种种形式: 第一种形式:  定义一个类,它的构造函数为private的, ...

  9. 解析Java反射 - invoke方法

    最近工作中涉及到获取同程火车票,大概描述为:将本地获取的发出城市,目的城市及出发时间按固定格式封装,调用接口获取可乘坐座席等级最高的火车票,接口返回数据用包含三层类封装的类接受,接受的类总共为四层,倒 ...

随机推荐

  1. equals深入理解

    package cn.galc.test; public class TestEquals { public static void main(String[] args) { /** * 这里使用构 ...

  2. layui中获取全部提交的数据

    <form class="layui-form" action="">...........input textarea ......</fo ...

  3. BZOJ[3728]PA2014 Final Zarowki

    有n个房间和n盏灯,你需要在每个房间里放入一盏灯.每盏灯都有一定功率,每间房间都需要不少于一定功率的灯泡才可以完全照亮. 你可以去附近的商店换新灯泡,商店里所有正整数功率的灯泡都有售.但由于背包空间有 ...

  4. 为什么说 Babel 将推动 JavaScript 的发展【转】

    Babel是一个转换编译器,它能将 ES6 转换成可以在浏览器中运行的代码.Babel 由来自澳大利亚的开发者Sebastian McKenzie创建.他的目标是使 Babel 可以处理 ES6 的所 ...

  5. run_jetty_run插件安装

    eclipse安装run_jetty_run不能使用在线模式,因为Google等网站已经被屏蔽,不能访问.要先下载jar包,本地安装.

  6. [2019杭电多校第七场][hdu6651]Final Exam

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6651 题意:n个科目,总共m分,通过一科需要复习花费科目分数+1分钟,在不知道科目分数的情况下,问最少 ...

  7. (五:NIO系列) Reactor模式

    出处:Reactor模式 本文目录 1. 为什么是Reactor模式 2. Reactor模式简介 3. 多线程IO的致命缺陷 4. 单线程Reactor模型 4.1. 什么是单线程Reactor呢? ...

  8. select,poll 和 epoll ??

    其实所有的 I/O 都是轮询的方法,只不过实现的层面不同罢了. 其中 tornado 使用的就是 epoll 的. selec,poll 和 epoll 区别总结 基本上 select 有 3 个缺点 ...

  9. [51Nod2558] 选址

    link 考虑二分答案 $F$ ,那么现在的问题变成是否对于覆盖并有交集. 考虑边 $(u,v)$ ,若覆盖并在 $(u,v,w)$ 线段中,设点 $i$ 走到 $u$ 号后还能走 $F1$ , 走到 ...

  10. linux下docker启动nginx无法访问80端口

    问题: Linux安装了docker,docker启动了一个nginx容器,通过 80 端口无法正常访问 故障排查: 1.检查 nginx 容器启动的命令或者yaml文件,查看是否有跟本机端口进行绑定 ...