第十四章 类型信息

尼玛,刚刚看完了亚冠,恒大这样都被连扳3球,尼玛的垃圾孙祥,恨死了那个全北现代

好吧,回到学习上

运行时类型信息使得你可以再程序运行时发现和使用类型信息

本章讨论的是java如何让我们在运行时识别对象和类的信息,主要有两种方式,第一种是传统的rtti,它假定我们在编译时就已经知道了所有的类型,另外一种是反射机制,它运行我们在运行时发现和使用类的信息

.为什么需要rtti

rtti的含义:在运行时,识别一个对象的类型,在向上转型或者向下转型都需要用到的

.Class对象

要了解rtti在java中的工作原理,就必需了解类型信息在运行时是如何表示的,这个工作是由称为class对象的特殊对象完成的。,它包含了与类相关的信息,

每一个类都有一个class对象,保存在同名的class文件中,为了生成这个类的对象,运行程序的jvm会使用类加载器的子系统

所有类的第一次使用,都会动态的加载到jvm中,java是动态加载的,只有有需要的时候才会加载

一旦某个类的class对象被载入内存,他就被用来创建这个类的所有对象

两种方法获取class对象的引用,第一种class.forname

第二种是.getclass

注意的方法是newinstance,获取这个class对象的实例,但是必须要有默认构造器才行(也就是无参构造器)

.类字面常量

java提供了一个更加简便的方法来创建class的引用,那就是类字面常量,到底怎木用呢,就是直接,fancytoy.class还可以对接口,数组,基本数据类型,对于基本数据类型可以使用,Boolean.TYPE不过建议用.class

.class不会初始化类

为了使用类而坐的准备工作

1.加载,就是在字节码中创建一个class对象

2.链接,为静态域分配空间,有必要则解析该类创建的其他类的引用

3.初始化,也就是初始化静态的东西

.泛化的class引用

其实对于泛化的作用,我个人的看法就是,让一些本在运行时才能检查的错误,使他能在编译期时就被检查到

而对class对象也是有效的

例如integer继承number,但是class<number> aa=int.class是错误的,为什么呢

因为integer的class对象没有继承number的class对象

不过在这里我们可以使用通配符?

通配符的应该经常使用

例如class<?extends number> aa=int.class是对的

.cast

这是java5添加的用于class引用的转型语法,即cast方法

其实与之前的强制转型效果差不多,不过在无法强制转型的时候,可以使用cast方法

.类型转换前先做检查

我们已知的rtti(运行时类型识别)

1.传统的类型转换

2.代表对象的类型的class对象

3.注意 instanceof,返回值告诉我们对象是不是某个特定类型的实例

向下转型可以使用第三种进行检查

.使用类字面常量

比使用getclass与forname好

.动态的instanceof

class.isinstance方法提供了一种动态地测试对象的途径

.instanceof与class的等价性

instanceof与isinstance生成的结果是你是这个类吗或者是你是这个类的派生类吗

equals与==的意思是你是这个类还是不是

.反射:运行时的类信息

在rmi(远程方法调用),在编译时无法知道该对象的类型,故无法使用rtti,使用可以使用反射机制

class类与java.lang.reflect类库对反射机制进行了支持

rtti与反射机制的区别在于能否在编译期获取到class文件,即该对象的类型信息

.类方法提取器

调用class.forname(arg【0】)这main传入得参数,如何就可以使用c.getmethod等方法进行反射了

.动态代理

简单调用好处就是将不同的额外的操作从实际对象分离到不同地方,这样修改起来就很方便

动态代理,这个在设计模式里面将为大家详解

.空对象

就是减少了检查null的枯燥,我个人觉得使得空也称为了不是特例,而是成为了一个真正的普通对象

与动态代理一起弄的地方还没有看明白,迟点写出了

.模拟对象与桩

空对象的逻辑变体就是模拟对象和桩

模拟对象往往是轻量级和自测试的

桩是重量级的,通过配置进行修改,是复杂对象

.接口与类型信息

interface的作用无非就是让程序隔离构件,减低耦合性,但是通过类型信息,耦合性仍然是被传播了出去

例如 A a=new B()  B实现A接口

if(a instanceof B){B b=(B)a;b.g();}

这样就耦合度就郑家了

解决方法1.直接声明

也就是使用包权限访问+控制构造对象,因为包的外表没有任何c类型可以用,所以不能转型为c

但是反射机制仍然可以访问这些,甚至是private

看起来真的声明都无法阻止反射机制去访问这些内容

利用反射机制可以访问后门?

这一章真的挺难理解的,因为没去上课,都是自己看书的,哎,有老师真好

不过我觉得这一章的亮点在于反射机制,给了我们新的一条路

注:java的反射机制详解 http://baike.baidu.com/view/1865203.htm

thinking in java 学习笔记 14 类型信息相关推荐

  1. Java 学习笔记 - 数组类型互转

    Java 学习笔记 - 数组类型互转 数组类型转换 字符串数组 to (Integer.Long.Double)列表 传统方式 Java8 Stream方式 数组 to 数组 字符串数组 to (in ...

  2. 《Java编程思想》笔记14.类型信息

    运行时类型信息使得你可以在运行时发现和使用类型信息,主要有两种方式: "传统的"RTTI,它假定我们在编译时已经知道了所有的类型: "反射"机制,它允许我们在运 ...

  3. Java编程思想--14类型信息

    第十四章类型信息 14.1 为什么需要RTTI 14.2 Class对象 Class对象 Class.forName(String s) 14.2.1字面类常量 14.2.2 泛化Class的引用 1 ...

  4. Java学习笔记---字符类型

    一.字符类型也算是整数类型的一种 字符类型在内存中占有2个字节,可以用来保存英文字母等字符.计算机处理字符类型时,是把这些字符当成不同的整数来看待,因此,严格说来,字符类型也算是整数类型的一种(小写a ...

  5. Java学习笔记 --- 字符类型

    一.字符类型 字符类型可以表示单个字符,字符类型是char, char是两个字节(可以存放汉字),多个字符我们用字符串String. public class Char01 {public stati ...

  6. Java学习笔记14

    Object类是所有类.数组.枚举类的父类,是类层次结构的根类.每个类都使用Object作为超类.所有对象(包括 数组)都实现这个类的方法. Object类实现了以下方法: 我们来看看源码中clone ...

  7. Java学习笔记14(接口+工厂模式)

    文章目录 接口 接口的特点: **为什么要接口** 工厂模式 接口 Java不支持多重继承.有了接口,就可以得到多重继承的效果. 接口(interface)是抽象方法和常量值的定义的集合. 从本质上讲 ...

  8. Java学习笔记 --- 布尔类型

    一.布尔类型 1.布尔类型也叫boolean类型,boolean类型数据只允许取值true和false,无null public class Bool {public static void main ...

  9. java笔记冯佳微盘,JAVA学习笔记14 - osc_vsdge2u3的个人空间 - OSCHINA - 中文开源技术交流社区...

    01(Map集合概述和特点) * A:Map接口概述 * 查看API可以知道: * 将键映射到值的对象 * 一个映射不能包含重复的键 * 每个键最多只能映射到一个值 * B:Map接口和Collect ...

最新文章

  1. Deep Learning论文笔记之(二)Sparse Filtering稀疏滤波
  2. 高级SQL优化(三) 常用优化工具 ——《12年资深DBA教你Oracle开发与优化——性能优化部分》...
  3. 带标签的循环语句、switch
  4. python3入门与进阶笔记_16_变量进阶 — 黑马程序员《Python入门教程完整版》笔记...
  5. Linux 磁盘分区 Fdisk
  6. [XSY4220] 九万步(结论)
  7. 【转】 NSArray copy 问题
  8. .NET Core 3.0 Preview 7 已经发布
  9. SystemVerilog中根据系统时间产生随机数的函数
  10. Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer
  11. LightGBM: gradient boosting算法轻量级框架介绍
  12. 恢复mysql数据--使用frm和ibd文件
  13. 微型计算机原理及应用吴宁课后答案,微机原理及应用(吴宁) 习题答案chapter7(4页)-原创力文档...
  14. Fission for Mac(简易音频编辑软件)附注册码 v2.4.5激活版
  15. iPhone检测是否存在耳麦
  16. 【Scala笔记——道】Scala 循环遍历 for详解
  17. [机器学习]模型评估方法
  18. python distance_to_Scipy: how to convert KD-Tree distance from query to kilometers (Python/Pandas)
  19. Web3 网络效应:五种心智模型
  20. 小白都能做到的使用css如何让一个盒子沾满剩余的空间

热门文章

  1. 系统设计 (二)设计类似TinyURL的短URL服务
  2. 游戏音乐从红白机到音乐会的发展历程
  3. 自定义hamcrest的Matcher
  4. 使用Docker安装Oracle步骤
  5. mysql ver 14.14下载_MySQL简介及安装 mysql Ver 14.14 Distrib 5.7.28
  6. 开都河畔白色蔷薇花之恋
  7. 阿里企业邮箱开通流程
  8. handlebar,js简单使用
  9. python微信库wxpy_python wxpy微信防撤回功能
  10. linux配置服务器端frpc,linux centos下 手动搭建frpc客户端实现穿透内网。