Thinking in Java – 类型信息

个人感觉 java 中的比較难的部分了,在看了些netty源代码发现事实上这块很实用。


这章重点是RTTI和反射。先说下自己的理解

RTTI是执行时识别。在c++中是用virtual来实现的,在编译期会忽略对象的详细类型信息,假定我们已经知道,并在执行时详细识别。

Java反射机制实在执行状态中,对于随意一个类,都能够知道这个类的全部属性和方法。对于随意一个对象。都能够调用它的随意一个方法和属性,这样的动态获取的信息以及动态调用对 象的方法的功能称为Java的反射机制


Class对象

Class对象就是用来创建类的全部的“常规”对象的。Java使用Class对象来执行其RTTI.

Class对象是什么

Java是一门纯面向对象的语言。在Java中,一切都是对象,也就是class,对于每一个类文件(每一个对象)编译后我们都会生成一个.class文件(javac hello.java —> hello.class)。*.class文件就是Class对象,在我们要第一次使用hello这个类文件时。JVM的类载入器会来载入hello.class文件,感觉Class对象就是一个模具。用来生产对象的。

注意:构造器也是静态方法

样例:

package onefour_chapter;

/**
* Created by wwh on 15-8-7.
*/ class Candy{
static {
System.out.println("Loading Candy");
}
} class Gum{
static {
System.out.println("Loading Gum");
}
} class Cookie{
static {
System.out.println("Loading Cookie");
}
} public class SweetShop {
public static void main(String[] args){
System.out.println("inside main");
new Candy();
System.out.println("After creating Candy");
try{
Class.forName("Gum");
}catch (ClassNotFoundException e){
System.out.println("not found Gum");
}
System.out.println("After Class.forName(\"Gum\")");
new Cookie();
System.out.println("After create Cookie");
}
}



我执行完发现结果和书上不一致,原因是Class.forName()參数要求是全然限定名,我的代码在包中。前面加上包名字就可以,例如以下

Class.forName(“包名.Gum”);

关键点:

static代码块

static修饰的代码块仅仅在类被载入时执行而且仅会被执行一次。一般用来初始化静态变量和调用静态方法,无论你new多少次,在jvm的声明周期里一个类仅仅被载入一次。

前面说构造器也是静态方法,所以test t = new test(),在第一次创建对象时jvm就会载入test类的Class对象(.class文件),Class对象就和其它对象一样,我们能够操控它的引用。forName()就是获取Class对象引用的一种方法。

Class.forName()返回对象的Class引用,从Class对象中我们能够获得许多的信息从而在执行时来抉择一些事情。很像c++的type_traits。注意使用newInstance()创造的类必须带有默认的构造器

static语句块

static语句块在类载入时执行。仅仅被执行一次

在用单例模式写封装数据库连接池时,new一个数据库连接池就被我写在了static代码块中,保证在类载入时就初始化好连接池,且仅仅初始化一次。(注意。訪问静态常量时。假设编译器能计算出来。则不会载入)

类载入:在终端下Java载入.class文件。Java命令的作用是启动虚拟机。虚拟机通过流从磁盘上将字节码(.class文件)中的内容读入虚拟机,并保存起来的过程。


类字面常量

Java还提供了一种方法来生成Class对象的引用,即类字面常量,classname.class,比方hello.class。它更安全和高效也不用try语句包裹。所以一般我们不使用forName(),可用于类,接口,数组。基本类型。建议使用.class的形式。.class执行了“尽可能”懒惰初始化,而forName()马上就初始化

为了使用类而做的准备工作有3个。载入–>连接–>初始化


范化的Class引用

Class引用总是指向某个Class对象,它能够制造类的实例。并包括可作用于这些实例的全部方法代码。它还包括该类的静态成员,因此,Class引用表示的就是它所指向的对象的确切类型。该对象便是Class类的一个对象。

向Class引用加入范型语法原因仅仅是为了编译器类型检查。前面说了RTTI和反射都是执行时的。如今我们在编译时也做了一些限定。更加保证了执行的正确性

为了在使用范化的Class引用时放松限制。能够使用了通配符,也但是使用通配符和extends关键字相结合。创建一个范围。

Class

import java.util.ArrayList;
import java.util.List; /**
* Created by wwh on 15-8-7.
*/ class CountedInteger{
static {
System.out.println("Class 载入");
}
private static long counter;
private final long id = counter++;
public String toString() { return Long.toString(id); }
} public class FilledList<T> {
private Class<T> type;
/* 构造函数。參数为被限定的Class对象,我们能够在实例化时来指定 */
public FilledList(Class<T> type){ this.type = type; }
public List<T> create(int nElements){
List<T> result = new ArrayList<T>();
try{
for(int i = 0; i < nElements; i++){
result.add(type.newInstance());
}
}catch (Exception e){
throw new RuntimeException();
}
return result;
} public static void main(String[] args){
/* 执行限定的类型,并传递.class作为构造函数的參数 */
FilledList<CountedInteger> fl = new FilledList<CountedInteger>(CountedInteger.class);
System.out.println(fl.create(15));
} }

RTTI在Java中的第三种形式是instanceof,它返回一个布尔值,告诉我们对象是不是某个特定的实例。

if(obj instanceof Dog) obj.exe();

instanceof有比較严格的限制,仅仅能将其与命名类型进行比較。而不能与FClass对象作比較

Class.isInstance()方法提供了一种动态地測试对象的途径。

Thinking in Java -- 类型信息RTTI的更多相关文章

  1. Java类型信息(RTTI和反射)

    要想在IT领域站得住脚,必须得不断地学习来强化自己,但是学过的技术不实践很容易便被遗忘,所以一直都打算开个博客,来记录自己学的知识,另外也可以分享给有需要的人! 最近在学习反射,为了更好地理解反射,就 ...

  2. JAVA类型信息——反射机制

    JAVA类型信息——反射机制 一.反射机制概述 1.反射机制:就是java语言在运行时拥有的一项自我观察的能力,java通过这种能力彻底了解程序自身的情况,并为下一步的动作做准备. 2.反射机制的功能 ...

  3. JAVA类型信息——Class对象

    JAVA类型信息——Class对象 一.RTTI概要 1.类型信息RTTI :即对象和类的信息,例如类的名字.继承的基类.实现的接口等. 2.类型信息的作用:程序员可以在程序运行时发现和使用类型信息. ...

  4. Java基础 -- 深入理解Java类型信息(Class对象)与反射机制

    一 RTTI概念 认识Claa对象之前,先来了解一个概念,RTTI(Run-Time Type Identification)运行时类型识别,对于这个词一直是 C++ 中的概念,至于Java中出现RT ...

  5. Java类型信息

    一.引言 最近在阅读<Java编程思想>,学习一下java类型信息,现在做一下总结.Java如何让我们在运行时识别对象和类的信息的.主要有两种方式:一种是传统的“RTTI”,它假定我们在编 ...

  6. JAVA类型信息——Class对象(转载)

    JAVA类型信息--Class对象 一.RTTI概要 1.类型信息RTTI :即对象和类的信息,例如类的名字.继承的基类.实现的接口等. 2.类型信息的作用:程序员可以在程序运行时发现和使用类型信息. ...

  7. Java类型信息之RTTI

    软件工程的一个核心问题就是软件的复用和扩展.面向对象思想通过封装,继承,派生等机制有效地解决了这个问题.但需求总是变幻莫测,不可琢磨,在面向对象这栋恢宏的大厦旁,还漂浮着一朵乌云,从而导致了RTTI的 ...

  8. Java 类型信息

    <Thinking in Java 4th>第14章 类型信息 运行时类型信息(Run-Time Type Identification)使得你可以在程序运行时发现和使用类型信息. 14. ...

  9. Java 类型信息详解和反射机制

    本文部分摘自 On Java 8 RTTI RTTI(RunTime Type Information)运行时类型信息,能够在程序运行时发现和使用类型信息,把我们从只能在编译期知晓类型信息并操作的局限 ...

随机推荐

  1. 利用RestTemplate进行http调用

    在对接API的时候,会涉及调用第三方的服务,这时候可以利用RestTemplate进行调用,下面给大家展示一个简单的调用demo. package com.tanlu.user.api.control ...

  2. qemu-img————QEMU的磁盘管理工具

    qemu-img command [command options] Command: check [-f fmt] filename                       # 对磁盘镜像文件进 ...

  3. iPhone模拟定位(非越狱修改手机定位)

    剩下的事情就是build一下到手机,那么,就可以看到神奇的效果!   本次带来一个简单又好玩的实用功能,比如定位装逼(共享定位非分享可选那种),又或者定位打卡之类,由于改变的是设备级别的定位,本设备所 ...

  4. HTML5增加与改良的input元素

    h5中form表单中input新增的属性值 在HTML5中增加了许多新的标签和功能属性,今天我们来看一个Form表单在HTML5中新的使用方法.那么在HTML5中新加入的这个功能与之前咱们使用的功能区 ...

  5. 条款27:尽量少做转型动作(Minimize casting)

    NOTE : 1.如果可以,尽量避免转型,特别是在注重效率的代码中避免dynamic_casts. 如果有个设计需要转型动作,试着发展无需转型的替代设计. 2.如果转型是必须要的,试着将它隐藏于某个函 ...

  6. 【MFC】利用MFC写一个计时器小程序

    1整体设计 创建对话框程序,并且设计对话框相关控件如图 相应的ID和对应的成员变量如图: 我的想法是这样的,只读属性的编辑框添加有CString类型的成员变量(如s_hour),在xxxDlg.h里另 ...

  7. 一些简单的JavaScript的方法

    <script type="text/javascript"> //js跳转 function UserMouserDown() { confirm('你确定要删除吗? ...

  8. 搜狗大数据总监、Polarr 联合创始人关于深度学习的分享交流 | 架构师小组交流会

    架构师小组交流会是由国内知名公司技术专家参与的技术交流会,每期选择一个时下最热门的技术话题进行实践经验分享.第一期:来自沪江.滴滴.蘑菇街.扇贝架构师的 Docker 实践分享 第二期:来自滴滴.微博 ...

  9. vscode安装插件

    十分简单,知道名字叫啥后,直接搜索,安装,就完了,还可以查看自己已经安装了哪些插件. step1 如图.png step2 image.png step 3 去网上查找想要安装的插件的名字 step ...

  10. 洛谷P2057 善意的投票

    题目描述 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可以投和自己本来 ...