获取Class字节码对象的三种方式
2016-09-17 13:07
183 查看
每个类被加载之后,系统就会为该类生成一个对应的字节码对象,通过该字节码对象就可以访问到JVM中的对应的类。在Java中获得Class对象通常有三种方式。
方式一,使用类的class属性:
Class<java.util.Date> clz1 = java.util.Date.class;
方式二,通过Class类中的静态方法forName(String className),传入类的全限定名(必须添加完整包名)
Class<?> clz2 = Class.forName(“java.util.Date”);
方式三,通过对象的getClass方法来实现,其中,getClass()是Object类中的方法,所有的对象都可以调用该方法
java.util.Date str = new java.util.Date();
Class<?> clz3 = str.getClass();
第一种方式和第二种方式都是直接根据类来获取字节码对象,相比之下,第一种方式更加安全,因为在编译时期就可以检查要访问的Class对象是否存在,同时不用调用方法,性能也更好,因此用第一种方式比较多。但是如果只能获得一个字符串,如”java.lang.String”,就只能用第二种方式,第二种方式可能会抛出ClassNotFoundException异常。
注意:同一个类在JVM中只存在一份字节码对象,也就说上述,claz1
== clz2 == clz3;
在上述讲了三种获取Class对象的方式,基本数据类型不能表示为对象,也就不能使用getClass的方式,基本类型没有类名的概念,也不能使用Class.forName的方式,如何表示基本类型的字节码对象呢?
实际上,所有的数据类型都有class属性.因此可以用class属性来表示:
Class clz = 数据类型.class;
九大内置Class实例:
JVM中预先提供好的Class实例byte,short,int,long,float,double,boolean,char,void.
表示为:byte.class,short.class,int.class,....void.class.
另外,在8大基本数据类型的包装类中,都有一个常量:TYPE,用于返回该包装类对应基本类的字节码对象.因此,Integer.TYPE
== int.class,但是注意,Integer和int是不同的数据类型
基本数据类型的Class实例可以用上面的方式,那么数组的Class实例又可以怎么表示呢?很简单,可以通过class属性,也可以通过对象.getClass()方式。
数组的Class实例:数组是引用数据类型,数组其实是对象.
如何来表示数组的Class实例.
方式1: 数组类型.class;
方式2: 数组对象.getClass();
注意:所有的具有相同的维数和相同元素类型的数组共享同一份字节码对象,和元素没有关系.
方式一,使用类的class属性:
Class<java.util.Date> clz1 = java.util.Date.class;
方式二,通过Class类中的静态方法forName(String className),传入类的全限定名(必须添加完整包名)
Class<?> clz2 = Class.forName(“java.util.Date”);
方式三,通过对象的getClass方法来实现,其中,getClass()是Object类中的方法,所有的对象都可以调用该方法
java.util.Date str = new java.util.Date();
Class<?> clz3 = str.getClass();
第一种方式和第二种方式都是直接根据类来获取字节码对象,相比之下,第一种方式更加安全,因为在编译时期就可以检查要访问的Class对象是否存在,同时不用调用方法,性能也更好,因此用第一种方式比较多。但是如果只能获得一个字符串,如”java.lang.String”,就只能用第二种方式,第二种方式可能会抛出ClassNotFoundException异常。
注意:同一个类在JVM中只存在一份字节码对象,也就说上述,claz1
== clz2 == clz3;
在上述讲了三种获取Class对象的方式,基本数据类型不能表示为对象,也就不能使用getClass的方式,基本类型没有类名的概念,也不能使用Class.forName的方式,如何表示基本类型的字节码对象呢?
实际上,所有的数据类型都有class属性.因此可以用class属性来表示:
Class clz = 数据类型.class;
九大内置Class实例:
JVM中预先提供好的Class实例byte,short,int,long,float,double,boolean,char,void.
表示为:byte.class,short.class,int.class,....void.class.
另外,在8大基本数据类型的包装类中,都有一个常量:TYPE,用于返回该包装类对应基本类的字节码对象.因此,Integer.TYPE
== int.class,但是注意,Integer和int是不同的数据类型
基本数据类型的Class实例可以用上面的方式,那么数组的Class实例又可以怎么表示呢?很简单,可以通过class属性,也可以通过对象.getClass()方式。
数组的Class实例:数组是引用数据类型,数组其实是对象.
如何来表示数组的Class实例.
方式1: 数组类型.class;
方式2: 数组对象.getClass();
注意:所有的具有相同的维数和相同元素类型的数组共享同一份字节码对象,和元素没有关系.
相关文章推荐
- 卡特兰数(出栈序列以及已知先序遍历求树的形状的个数)
- Shiro 学习笔记(5)—— 自定义权限解析器和角色解析器
- 2016Android某公司面试题
- 宿舍管理系统
- oracle 职业学习指引
- css初始化样式(重置默认样式)
- Android -- 固定在ScrollView顶部的View,类似于新浪微博的评论列表的顶部
- Android 解耦方法 ~~~ 事件总线
- Shiro 学习笔记(4)—— 基于字符串的角色和权限
- Sunny-Ngrok
- Shiro 学习笔记(3)—— 自定义 Realm
- Ubuntu 16.04 标题栏实时显示上下行网速、CPU及内存使用率
- 启动hadoop集群DataNode不显示,DataNode显示NodeManager不显示
- 215. Kth Largest Element in an Array 难度:medium 类别:分治
- java在word(*.docx)指定地点插入图片
- 泡了个学妹,好开心
- Shiro 学习笔记(2)—— JdbcRealm
- jeb2 demo keygen.md
- java在pdf模板的指定位置插入图片
- jeb2 demo keygen.md