Class对象
来源:互联网 发布:下载默默软件 编辑:程序博客网 时间:2024/05/17 02:59
RTTI
我们要知道,Java让我们在运行时识别对象和类信息,主要通过两种方式,一种就是传统的RTTI,另一种是反射(Reflection)。两者的区别是,RTTI是在编译时就获得了所有类型信息,而反射是在运行时发现和使用类的信息。
RTTI分为三种形式:
1:传统的类型转换,例如经典的Animal的子类上转时类型转换。
2:Class对象,通过查询Class对象可以获得运行时所需的信息。
3:关键字instanceof,返回boolean,告诉我们对象是否是某个特定的实例。
重点谈Class
Java的ATTI就是通过Class对象来执行的,它包含了与类有关的所有信息,例如该类的父类,接口,构造方法,成员等,它本身就是用于创建类的所有常规对象的。
每一个类都有一个Class对象,每编译一个类,就会生成相应的.class文件,这些.class文件都会被类加载器(ClassLoader)加载到JVM中,并且会产生一个Class对象,保存在内存中。一旦类的Class对象载入内存,他就用来创建这个类的所有对象。实际上我们通过new来创建对象,内部就是通过Class来创建的。
获取Class对象引用的三种方式
一:Class.forname(”java.lang.String”);这里的参数必须为全限定类名
二:对象.getClass()
三:类字面常量(String.class)
Class的常用方法:
- getName():获取限定类名
- getSimpleName():只获取类名
- getSuperClass():获取该类的父类
- getInterfaces():获取该类的接口
更多方法参考api文档
class A{}interface B{}class C extends A implements B{}public class TestClass { public static void main(String[] args) { //1.类字面常量 Class<?> c = C.class; //2.Class.forName()形式 //Class<?> c = Class.forName("test.C"); //3.对象.getClass()形式 //Class<?> c = new C().getClass(); System.out.println(c.getName()); System.out.println(c.getSimpleName()); System.out.println(c.getCanonicalName()); System.out.println(c.getSuperclass()); System.out.println(c.getInterfaces()[0]); }}
结果为:
test.CCtest.Cclass test.Ainterface test.B
forName()和.class形式的区别
看这段代码:
class A{ static{ System.out.println("This is A"); }}class B{ static{ System.out.println("This is B"); }}public class TestClass { public static void main(String[] args) throws ClassNotFoundException { Class<?> a = A.class; System.out.println("After A"); new A(); Class<?> b = Class.forName("test.B"); System.out.println("Ager B"); }}
分别是两种形式调用,结果如下:
After AThis is AThis is BAger B
说明什么问题?很明显,.class的形式并不会执行类中的static块,而forName则会立马执行类中的statiic块。也就是说,.class不会对类进行初始化,而forName立即就进行了初始化。这就是两者最大的区别
- Class对象
- Class对象
- Class 对象
- class对象
- Class对象
- Class对象
- Class对象
- Class对象
- Class对象
- Class对象
- Class对象
- Class对象
- Class对象
- Class对象
- [Java] Class对象
- 产生inner class对象
- Class对象测试
- class 对象对齐
- Android Studio---Error:(1, 0) Your project path contains non-ASCII characters.
- LeetCode 155 Min Stack (Java 容器 泛型)
- bootstrap datetimepicker 左右箭头不显示 icon-arrow-left
- 软件设计师——计算机与软件工程知识&学习要点(上午题B)
- 第1章 初识hadoop
- Class对象
- CocoaPods 更新时遇到无法更新指定版本的问题
- 【HDU 1179 二分图 】
- 求一个整数对应的二进制中的1的个数(位操作)
- function类型
- 看我如何应对QQ机器人验证
- 文字排版字体怎么排版
- 注解配置Oracle自定义序列
- 2016.08.16【初中部 NOIP提高组 】模拟赛C