TIJ——Chapter Fourteen:Type Information
- Runtime type information(RTTI) allows you to discover and use type information while a program is running.
- All classes are loaded into the JVM dynamically, upon the first use of a class. This happens when the program makes the first reference to a static member of that class. It turns out that the constructor is also a static method of a class, even though the static keyword is not used for a constructor. Therefore, creating a new object of that class using the new operator also counts as a reference to a static member of the class.
- The class loader first checks to see if the Class Object for that type is loaded. If not, the default class loader finds the .class file with that name(an add-on class loader might, for example, look for the bytecodes in a database instead). As the bytes for the class are loaded, they are verified to ensure that they have not been corrupted and that they do not comprise bad Java code(this is one of the lines of defense for security in Java). Once the Class object for that type is in memory, it is used to create all object of that type.
- Java provides a second way(except Class.forName()) to produce the reference to the Class object: the class literal. This would look like: java.util.ArrayList.class; which is not only simpler, but also safer since it's checked at compile time(and thus does not need to be placed in a try block). Because it eliminates the forName() method call, it's also more efficient. Class literals work with regular classes as well as interfaces, arrays, and primitive types. In addition, there's a standard field called TYPE that exists for each of the primitive wrapper classes. The TYPE field produces a reference to the Class object for the associated primitive type, such as: boolean.class is equivalent to Boolean.TYPE.
- It's interesting to note that creating a reference to a Class obejct using ".class" doesn't automatically initialize the Class object. There are actually three steps in preparing a class for use:Effectively, initialization is "as lazy as possible." Just using the .class syntax to get a reference to the class doesn't cause initialization. However, Class.forName() initializes the class immediately in order to produce the Class reference. If a static final value is a "compile-time constant", that value can be read without causing the corresponding class to be initialized. Making a field static and final, however, does not guarantee this behavior(forces class initialization if it don't be a compile-time constant). If a static field is not final, accessing it always requires linking(to allocate storage for the field) and initialization(to initialize that storage) before it can be read.
- Loading, which is performed by the class loader. This finds the bytecodes(usually, but not necessarily, on your disk in your classpath) and create a Class object from those bytecodes.
- Linking. The linke phase verifies the bytecodes in the class, allocates storage for static fields, and if necessary, resovles all references to other classes made by this class.
- Initialization. If there's a superclass, initialize that. Execute static initializers and static initialization blocks.
- 注: Initialization is delayed until the first reference to a static method(the constructor is implicitly static) or to a non-constant static field.
- Effectively, initialization is "as lazy as possible". Just using the .class syntax to get a reference to a class doesn't cause initialization. However, Class.forName() initializes the class immediately in order to produce the Class reference. If a static final value is a "compile-time constant", that value can be read without causing the corresponding class to be initialized. Making a field static and final, however, does not guarantee this behavior(force class initialization if it don't be a compile-time constant). If a static field is not final, accessing it always requires linking(to allocate storage for the field) and initialization(to initialize that storage) before it can be read.
- The reason for adding the generic syntax to Class references is only to provide compile-time type checking, so that if you do something wrong you find out about it a little sooner.
- It's important to use instanceof before a downcast when you don't have other information that tells you the type of the object; otherwise, you'll end up with a ClassCastException.
- It's important to realize that there's nothing magic about reflection. When you're using reflection to interact with an object of an unknown type, the JVM will simply look at the object and see that it belongs to a particular class(just like an ordinary RTTI). Before anything can be done with it, the Class object must be loaded. Thus, the .class file for that particular type must still be available to the JVM, either on the local machine or across the network. So the true difference between RTTI and reflections is that with RTTI, the compiler opens and examines the .class file at compile time. Put another way, you can call all the methods of an object in the "normal" way. With reflection, the .class file is unavailable at compile time; it is opened and examined by the runtime environment.
静态代理VS动态代理:
对于静态代理,一个委托类对应一个代理类,因此过度使用静态代理会导致大量的代理类产生。于是出现了动态代理,对于相同逻辑的代理,我们只需要动手实现一遍,就可以以相同的处理方式代理不同的委托类。
TIJ——Chapter Fourteen:Type Information的更多相关文章
- (TODO:)下载图片,报错:warning: could not load any Objective-C class information from the dyld shared cache. This will significantly reduce the quality of type information available.
想使用NSInvocationOperation下载图片,然而并没有下载下来, NSData为nil, 还有报错:(打断点就报错) warning: could not load any Object ...
- TIJ——Chapter Eight:Polymorphism
The twist |_Method-call binding Connecting a method call to a method body is called binding. When bi ...
- CCJ PRML Study Note - Chapter 1.6 : Information Theory
Chapter 1.6 : Information Theory Chapter 1.6 : Information Theory Christopher M. Bishop, PRML, C ...
- RTTI(Runtime Type Information )
RTTI 是“Runtime Type Information”的缩写,意思是:运行时类型信息.它提供了运行时确定对象类型的方法.本文将简略介绍 RTTI 的一些背景知识.描述 RTTI 的概念,并通 ...
- Dynamic type checking and runtime type information
动态类型的关键是将动态对象与实际类型信息绑定. See also: Dynamic programming language and Interpreted language Dynamic type ...
- C++ - RTTI(RunTime Type Information)执行时类型信息 具体解释
RTTI(RunTime Type Information)执行时类型信息 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details ...
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(十四)之Type Information
Runtime type information (RTTI) allow you to discover and use type information while a program is ru ...
- RTTI (Run-time type information) in C++
In C++, RTTI (Run-time type information) is available only for the classes which have at least one v ...
- TIJ——Chapter Two:Everything Is an Object
If we spoke a different language, we would perceive a somewhat different world. Ludwig Wittgenstein( ...
随机推荐
- Hadoop 集群规模要多大
- useradd -M -s /sbin/nologin mysql -g mysql 报错 Creating mailbox file
由于之前使用以下命令删除了mysql账户 userdel mysql groupdel mysql #如果删除了mysql用户,对应的组也会被删除(只有一个用户的情况下) 执行以下命令时报错 ...
- stream之累加求和
1.集合中直接包含BigDecimal元素的累加 List<Integer> list = new ArrayList<>();list.add(3);list.add(7); ...
- float示例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [转]JS设计模式-单例模式(二)
单例模式是指保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式是一种常用的模式,有一些对象往往只需要一个,比如线程池.全局缓存.浏览器中的window对象等.在javaScript开发中 ...
- Eular质数筛法
小Hi:我们可以知道,任意一个正整数k,若k≥2,则k可以表示成若干个质数相乘的形式.Eratosthenes筛法中,在枚举k的每一个质因子时,我们都计算了一次k,从而造成了冗余.因此在改进算法中,只 ...
- MacBook 启用或停用 root 用户
启用或停用 root 用户 选取苹果菜单 () >“系统偏好设置”,然后点按“用户与群组”(或“帐户”). 点按 ,然后输入管理员名称和密码. 点按“登录选项”. 点按“加入”(或“编辑”). ...
- flask中cookie和session设置
flask中cookie和session介绍 一.cookie: 在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户. ...
- Python 可变类型和不可变类型,以及其引用
基本数据类型的引用 在Python中定义一个数据便在内存中开辟一片空间来存储这个变量的值,这块已经被分配的内存空间便会有一个内存地址.访问这块内存需要用到变量名,变量名实际存储的是变量的 ...
- 华为RH2288 V3服务器进入BIOS并设置iBMC地址
服务器重启后 第一个画面 提示Ctrl+H或Ctrl+S进入相关配置 其中, Ctrl+H进入WebBIOS初次安装系统可在此做RAID配置 此画面不做操作,等待跳过 进入第二画面 可以选择BootM ...