`
abcxo
  • 浏览: 33277 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

thinking in java 学习笔记 14 类型信息

阅读更多

第十四章 类型信息

 

 

尼玛,刚刚看完了亚冠,恒大这样都被连扳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学习笔记

    《Thinking in Java》是一本深度解析Java编程语言的经典著作,其深入浅出的讲解和丰富的实例使得读者能够全面理解Java的精髓。以下是对书中部分关键知识点的总结: 1. **Java 泛型**:泛型是Java SE 5.0引入的重要...

    Thinking in Java 自学笔记——第二章 一切皆对象

    ### Thinking in Java 自学笔记——第二章 一切皆对象 #### 重要概念解析 ##### 2.1 用引用操纵对象 在Java中,一切都被视为对象,这意味着无论是字符串、数字还是其他数据类型都可以被视为对象来进行操作。当...

    Thinking in Java读书笔记

    ### Thinking in Java 读书笔记知识点总结 #### 一、万事万物皆对象 1. **对象存储位置** - **寄存器**:程序无法直接控制。 - **栈(Stack)**:存储基本类型数据和对象引用,但对象本身不在此处。 - **堆(Heap)...

    王者归来之Thinking in java读书笔记

    《王者归来之Thinking in Java读书笔记》是对Bruce Eckel的经典之作《Thinking in Java》第四版的深度学习与总结。这本书是Java程序员的必备参考书,它深入浅出地阐述了Java语言的核心概念和技术,旨在帮助读者理解...

    Thinking in Java 自学笔记——第一章 对象导论

    Thinking in Java 自学笔记——第一章 对象导论 本章节总结了面向对象程序设计(Object-oriented Programming, OOP)的基本概念和原则,以帮助读者更好地理解 Java 编程语言。以下是对标题、描述、标签和部分内容的...

    Thinking In java学习笔记

    ### Thinking In Java 学习笔记知识点总结 #### 面向对象编程(OOP)的重要性及其影响 面向对象编程(OOP)在软件开发领域产生了深远的影响。它不仅提高了开发效率和降低了维护成本,还简化了设计流程,使得编程任务...

    thinking in java 读书笔记(五)

    《Thinking in Java》是Bruce Eckel的经典之作,它深入浅出地讲解了Java语言的核心概念和技术,对于初学者和有经验的开发者来说都是极好的学习资源。这篇读书笔记主要聚焦在第五部分的内容,可能涵盖了类、对象、...

    Thinking In Java的笔记_第一章

    通过以上概述,《Thinking In Java》第一章深入浅出地讲解了Java的基础概念,涵盖了面向对象编程的核心原则、数据的存储与管理、基本类型与包装类的使用,以及高精度数字的处理技巧,为初学者和进阶学习者提供了宝贵...

    Thinking in java读书笔记.docx

    这些只是《Thinking in Java》中的一部分内容,全书还包括类、接口、多态性、异常处理、集合框架、并发编程等多个主题,是Java学习者的宝贵资源。理解和掌握这些基础知识是成为一名熟练Java程序员的关键步骤。

    java基础补足和thinking In Java学习.rar

    JAVA学习日记---Thinking in Java学习笔记 第5章总结 第五章 初始化与清理 5.1 用构造器确保初始化 1.构造器命名必须与类名相同 2.构造器也是方法,满足方法的各种特征,无参数的构造器称为默认构造器,默认构造...

    Java学习笔记.pdf

    我的学习笔记的书本课程来自于:《Thinking in Java》和《Head First Java》 视频课程主要来自于:廖雪峰老师《Java 基础课程》 如涉及版权侵犯请联系我更正。 初来乍到,文笔稚嫩,学识浅薄,请多指教。

    包括JAVA夜未眠,thinkingJAVA和学习笔记

    在IT领域,特别是Java编程的学习过程中,"JAVA夜未眠,thinkingJAVA和学习笔记"这一主题涵盖了许多核心概念和实践技巧。以下是对这些资源的详细解释: 首先,"Java夜未眠"可能指的是一个深入探讨Java编程的书籍或...

    中文版Thinking in Java 4th编程思想(笔记)

    《中文版Thinking in Java 4th编程思想》是学习Java编程的重要参考资料,它深入浅出地介绍了面向对象编程的核心概念。下面将详细解读其中的主要知识点。 1. **对象导论** - **万物皆对象**:Java编程的核心是对象...

    《Thinking+in+Java》读书笔记共38页.pd

    总之,《Thinking in Java》的读书笔记结合了广泛的Java知识和实践应用,从基础知识到高级主题,从理论到实践,为学习和提升Java编程技能提供了全面的资源。无论是对初学者还是经验丰富的开发者,这都是一个宝贵的...

    用于存放java源码和Thinking of Java的资源

    其次,"Thinking in Java"的资源可能包括了课后练习、习题解答、代码注释或者其他辅助学习材料。这些资源对于自学Java的人来说极其宝贵,它们可以帮助检验学习效果,解决遇到的问题,并提供额外的实践机会。通过完成...

    Java JDK 6.0 学习笔记.pdf

    **Java JDK 6.0 学习笔记** Java JDK(Java Development Kit)是Java编程语言的核心组件,包含Java运行环境、编译器、类库以及各种工具,是开发者进行Java程序开发的基础。Java JDK 6.0是Oracle公司发布的一个重要...

    恒生电子JAVA笔试试题-Thinking-In-Java-Notes:ThinkinginJava学习笔记

    Java》学习笔记 [TOC] 阅读计划 章节列表 对象导论 一切都是对象 操作符 控制执行流程 初始化与清理 访问权限控制 复用类 多态 接口 内部类 持有对象 通过异常处理错误 字符串 类型信息 泛型 数组 容器深入研究 Java...

    5本java学习用书

    3. **《Thinking in Java》**:Bruce Eckel的这部巨著深入细致地介绍了Java语言,不仅涵盖基础,还涉及高级特性如多线程、网络编程、反射等。它的特点是理论与实践相结合,通过大量的实例来阐述概念,是提升Java技能...

Global site tag (gtag.js) - Google Analytics