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( ...
随机推荐
- Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F
Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...
- MySQL系列(九)--InnoDB索引原理
InnoDB在MySQL5.6版本后作为默认存储引擎,也是我们大部分场景要使用的,而InnoDB索引通过B+树实现,叫做B-tree索引.我们默认创建的 索引就是B-tree索引,所以理解B-tree ...
- Django项目:CRM(客户关系管理系统)--18--10PerfectCRM实现King_admin日期优化
#kingadmin_tags.py # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理———————— # # 因为前端禁止使用下划线开头(_meta.ve ...
- bzoj 3110 [Zjoi2013]K大数查询——线段树套线段树(标记永久化)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3110 第一道线段树套线段树! 第一道标记永久化! 为什么为什么写了两个半小时啊…… 本想线段 ...
- php版本选择
对应环境,选择对应的php包 apache环境:VC6.TS(thread safe) IIS环境:VC9.NTS(non thread safe)
- hdu 1059 Dividing(多重背包优化)
Dividing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- java验证码识别
首先参考了csdn大佬的文章,但是写的不全ImgUtils类没有给出代码,无法进行了 写不完整就是制造垃圾 不过这个大佬又说这个大佬的文章值得参考于是又查看这篇文章 有案例https://blog.c ...
- 2019-4-16-C#-在-8.0-对比-string-和-string_-的类型
title author date CreateTime categories C# 在 8.0 对比 string 和 string? 的类型 lindexi 2019-04-16 10:16:56 ...
- Python实例 分割路径和文件名
import os.path # 常用函数有三种:分隔路径,找出文件名.找出盘符(windows系统),找出文件的扩展名. # 根据你机器的实际情况修改下面参数. spath = " D: ...
- Data Lake Analytics账号和权限体系详细介绍
一.Data Lake Analytics介绍 数据湖(Data Lake)是时下大数据行业热门的概念:https://en.wikipedia.org/wiki/Data_lake.基于数据湖做分析 ...