JS基础-Java Class类以及获取Class实例的三种方式

由于JVM为每个加载的class创建了对应的Class实例,并在实例中保存了该class的所有信息,包括类名、包名、父类、实现的接口、所有方法、字段等,因此,如果获取了某个Class实例,我们就可以通过这个Class实例获取到该实例对应的class的所有信息。
这种通过Class实例获取class信息的方法称为反射(Reflection)

如何获取一个class的Class实例?有三个方法:

方法一:直接通过一个class的静态变量class获取:

>Class cls = String.class;

方法二:如果我们有一个实例变量,可以通过该实例变量提供的getClass()方法获取:

String s = "Hello";
Class cls = s.getClass();

方法三:如果知道一个class的完整类名,可以通过静态方法Class.forName()获取:

Class cls = Class.forName(“java.lang.String”);

因为Class实例在JVM中是唯一的,所以,上述方法获取的Class实例是同一个实例。可以用==比较两个Class实例:

Class cls1 = String.class;String s = "Hello";
Class cls2 = s.getClass();boolean sameClass = cls1 == cls2; // true

注意一下Class实例比较和instanceof的差别:

Integer n = new Integer(123);boolean b1 = n instanceof Integer; // true,因为n是Integer类型
boolean b2 = n instanceof Number; // true,因为n是Number类型的子类boolean b3 = n.getClass() == Integer.class; // true,因为n.getClass()返回Integer.class
boolean b4 = n.getClass() == Number.class; // false,因为Integer.class!=Number.class

用instanceof不但匹配指定类型,还匹配指定类型的子类。而用==判断class实例可以精确地判断数据类型,但不能作子类型比较。

通常情况下,我们应该用instanceof判断数据类型,因为面向抽象编程的时候,我们不关心具体的子类型。只有在需要精确判断一个类型是不是某个class的时候,我们才使用==判断class实例。

因为反射的目的是为了获得某个实例的信息。因此,当我们拿到某个Object实例时,我们可以通过反射获取该Object的class信息:

void printObjectInfo(Object obj) {Class cls = obj.getClass();
}

小结

JVM为每个加载的class及interface创建了对应的Class实例来保存class及interface的所有信息;

获取一个class对应的Class实例后,就可以获取该class的所有信息;

通过Class实例获取class信息的方法称为反射(Reflection);

JVM总是动态加载class,可以在运行期根据条件来控制加载class。

JS基础-Java Class类以及获取Class实例的三种方式相关推荐

  1. java反射之获取class对象,Java之反射机制(获取Class对象的三种方式)

    Java之反射机制(获取Class对象的三种方式) 开发工具与关键技术:MyEclipse 10,java 作者:刘东标 撰写时间:2019-06-14 如何得到各个字节码对应的实例对象? 每个类被加 ...

  2. 获取class文件对象三种方式

    Class类 阅读API的Class类得知,Class 没有公共构造方法.Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的 获取Clas ...

  3. 反射应用和获取Class对象的三种方式

    一.写一个"框架",可以创建任何对象运行任何方法 1.配置文件 2.使用类加载器ClassLoader,Properties集合是可以和IO流结合使用完成读取和写入数据的集合,方法 ...

  4. 获取Class对象的三种方式

    获取Class对象的三种方式 Object --> getClass() 通过对象.getclass 任何数据类型(包括基本数据类型)都有一个"静态"的class属性 通过类 ...

  5. Java动物类enjoy方法打印_Java反射学习-2 - 获取Class对象的三种方式

    1 packagecn.tx.reflect;2 3 importjava.lang.reflect.Constructor;4 importjava.lang.reflect.Field;5 imp ...

  6. java获取反射机制的三种方式

    更多免费教学文章请关注这里 java 获取反射常使用的三种方式: 1.通过new对象实现反射机制 2.通过路径实现反射机制 3.通过类名实现反射机制 通过Object类的getClass方法来获取 使 ...

  7. java当前时间_java 获取当前时间的三种方法

    总结java里面关于获取当前时间的一些方法 System.currentTimeMillis() 获取标准时间可以通过System.currentTimeMillis()方法获取,此方法不受时区影响, ...

  8. java 多线程编程(包括创建线程的三种方式、线程的生命周期、线程的调度策略、线程同步、线程通信、线程池、死锁等)

    1 多线程的基础知识 1.1 单核CPU和多核CPU 单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务.微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那 ...

  9. Struts2-从值栈获取list集合数据(三种方式)

    创建User封装数据类 public class User {private String username;private String password;public String getPass ...

最新文章

  1. matlab gcc4.7,关于gcc-4.7.2 cannot compute suffix of object fil...
  2. 英朗gt仪表盘图标说明_BuildRun低代码开发教程八节 | 图表和仪表盘展示
  3. 基于spring注解AOP的异常处理
  4. 【Lolttery】项目开发日志 (七)socket io 结合 react js实现简单聊天室
  5. linux dev log设备文件,Linux中设备号及设备文件【转】
  6. tensorflow报错raise RuntimeError('The Session graph is empty.  Add operations to the ' RuntimeError:
  7. 装饰者模式的应用:react高阶组件和ES6 装饰器
  8. NTC热敏电阻阻值-温度对照表
  9. 彻底卸载vscode Linux,Ubuntu vscode 安装与卸载
  10. Pentaho RestAPI用户角色管理
  11. vscode json插件
  12. fastapi框架tortoise-orm运用
  13. Inkscape制作logo
  14. 品牌数字化转型|借势营销节点,3 招解锁品牌营销力
  15. android 手机强制关机代码,安卓手机强制重启方法
  16. sha1安全码校验工具(apk)
  17. 【用JS自制表格软件玩数据】9. 自制三维 K线图 蜡烛图
  18. 浅谈如何上好小学信息技术课
  19. 黑马Python数据分析网课个人笔记01
  20. matlab 求矩阵秩,用MATLAB编程求矩阵的秩

热门文章

  1. CPU核心数和线程数的关系
  2. 【Wordle】Day5:换个开始单词全灰可还行,四次成功
  3. vue组件间传值的几种方法
  4. linux红旗4关闭ntp服务,linux操作系统停NTP服务器配置
  5. java数组转为字符串_java数组转字符串要如何转换?一般有几种方法?
  6. N42-WeekNine
  7. 干部身份、三方协议、派遣证
  8. 有多少人知道睿捷的前身?
  9. vue自定义组件页面以及导入组件页面
  10. RocketMq学习- 安装