JS基础-Java Class类以及获取Class实例的三种方式
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实例的三种方式相关推荐
- java反射之获取class对象,Java之反射机制(获取Class对象的三种方式)
Java之反射机制(获取Class对象的三种方式) 开发工具与关键技术:MyEclipse 10,java 作者:刘东标 撰写时间:2019-06-14 如何得到各个字节码对应的实例对象? 每个类被加 ...
- 获取class文件对象三种方式
Class类 阅读API的Class类得知,Class 没有公共构造方法.Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的 获取Clas ...
- 反射应用和获取Class对象的三种方式
一.写一个"框架",可以创建任何对象运行任何方法 1.配置文件 2.使用类加载器ClassLoader,Properties集合是可以和IO流结合使用完成读取和写入数据的集合,方法 ...
- 获取Class对象的三种方式
获取Class对象的三种方式 Object --> getClass() 通过对象.getclass 任何数据类型(包括基本数据类型)都有一个"静态"的class属性 通过类 ...
- Java动物类enjoy方法打印_Java反射学习-2 - 获取Class对象的三种方式
1 packagecn.tx.reflect;2 3 importjava.lang.reflect.Constructor;4 importjava.lang.reflect.Field;5 imp ...
- java获取反射机制的三种方式
更多免费教学文章请关注这里 java 获取反射常使用的三种方式: 1.通过new对象实现反射机制 2.通过路径实现反射机制 3.通过类名实现反射机制 通过Object类的getClass方法来获取 使 ...
- java当前时间_java 获取当前时间的三种方法
总结java里面关于获取当前时间的一些方法 System.currentTimeMillis() 获取标准时间可以通过System.currentTimeMillis()方法获取,此方法不受时区影响, ...
- java 多线程编程(包括创建线程的三种方式、线程的生命周期、线程的调度策略、线程同步、线程通信、线程池、死锁等)
1 多线程的基础知识 1.1 单核CPU和多核CPU 单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务.微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那 ...
- Struts2-从值栈获取list集合数据(三种方式)
创建User封装数据类 public class User {private String username;private String password;public String getPass ...
最新文章
- matlab gcc4.7,关于gcc-4.7.2 cannot compute suffix of object fil...
- 英朗gt仪表盘图标说明_BuildRun低代码开发教程八节 | 图表和仪表盘展示
- 基于spring注解AOP的异常处理
- 【Lolttery】项目开发日志 (七)socket io 结合 react js实现简单聊天室
- linux dev log设备文件,Linux中设备号及设备文件【转】
- tensorflow报错raise RuntimeError('The Session graph is empty. Add operations to the ' RuntimeError:
- 装饰者模式的应用:react高阶组件和ES6 装饰器
- NTC热敏电阻阻值-温度对照表
- 彻底卸载vscode Linux,Ubuntu vscode 安装与卸载
- Pentaho RestAPI用户角色管理
- vscode json插件
- fastapi框架tortoise-orm运用
- Inkscape制作logo
- 品牌数字化转型|借势营销节点,3 招解锁品牌营销力
- android 手机强制关机代码,安卓手机强制重启方法
- sha1安全码校验工具(apk)
- 【用JS自制表格软件玩数据】9. 自制三维 K线图 蜡烛图
- 浅谈如何上好小学信息技术课
- 黑马Python数据分析网课个人笔记01
- matlab 求矩阵秩,用MATLAB编程求矩阵的秩