java学习笔记一 java类型信息(RITI和反射)
来源:互联网 发布:手机有声朗读软件 编辑:程序博客网 时间:2024/06/07 11:56
<Tinking in java > 类型信息 学习笔记 浅谈一些个人理解,阐述不对地方,希望大家能多多指正 !
java类型信息 就是 程序运行时类型的信息这些(包括 方法 属性)分为两种
一种是 RITI (RunTime Type information)执行时类型信息
要求:必须是编译时知道所有类型
过程:生成.class字节码 ,jvm对字节码加载( 类的加载分为三个步骤
装载(load)连接(link) (initialize)初始化
第一 :装载 就是 查找并加载类的二进制(class文件)
第二:连接 ------分为三步骤 验证 :确保类的正确性 (因为可能有人恶意的上传一个伪class文件,如果不验证 后果不可想象)
准备:改类的静态变量 分配内存空间,并初始化默认值
解析:把类中的符号引用,转为直接引用
第三:初始化 为静态变量赋予真正的值
下面我们继续分析 RITI 它解放了程序在编译期间执行的面向类型的操作,不管是程序的安全性还是可扩展性和可维护性,都得到了大大的加强 。 class对象是RITI在java中工作机制的核心 无论何时,只要我们想要在运行时使用类型信息,就必须获得恰当的class对象的引用。常规来讲
class对象有三种获得方式
Class.forName():最简单的,也是最快捷的方式,因为我们并不需要为了获得class对象而持有该类的对象实例
obj.getClass():当我们已经拥有了一个感兴趣的类型的对象时,这个方法很好用。
Obj.class : 类字面常量,这种方式很安全,因为它在编译时就会得到检查(因此不需要放到try语句块中),而且高效。
那么什么是class引用 ,我认为 class引用表示的是它指向对象的确切类型,并且通过class对象我们 能获取特点类的几乎所有信息,
instanceof 关键字 是判断该对象是否是改类型的实例 布尔类型
动态的instanceof
instanceof运算符 只被用于对象引用变量,检查左边的被测试对象 是不是 右边类或接口的 实例化。如果被测对象是null值,则测试结果总是false
而且instaceof 是为instaceof操作 多用于多态中判断是否是该类型或该类型的父类,比较的两者要么有类型对等的关系要么有继承的关系,没有关系的两者进行比较,编译是无法通过的。
这里插一段 java对象实例有五种方式
1. 用new 创建一个对象 最常见的 Object obj=new Object();
2.用工厂方法返回一个对象 String s=String.valueof(a);
3、运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。如:Object obj = Class.forName("java.lang.Object").newInstance();
4、调用对象的clone()方法。
5、通过I/O流(包括反序列化),如运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。
第二种 是反射机制
原理 :JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制
那么是因为什么 我们需要它? RITI不是更安全吗 ?
起因:在大型项目开发里面 我们可能 是基于构件的编程、还有可能是用某种基于快速开发(RAD)的应用构件工具,即集成开发环境(IDE)远程方法调用(RMI) 分布式开发 (可以将一个java对象分部到多台机器上)这些RIIT都支持不了 因为不能编译完之后再检查,这些都是运行或者说是即时信息,只有运行时 才能确定
过程 :要解决这个问题 java 可以用lang包下的reflect 反射 包含field 、Method、Constructor 类(每个类都实现了Member接口)
在jvm运行时创建,用以表示未知类里对应的成员 步骤
a Construstor创建新的对象,用get(),set()方法读取和修改filed对象关联字段
b 用invoke()方法调用与method对象关联的方法 还可以调用getFileds()、getMethods()和getCntructors()很便利的方法,以返回表示字段、方法以及构造器的对象数组
那么RITI和反射二者区别 就不言而喻了
对RITI来说,编译器在编译时打开和检查.class文件(换句话说,我们可以用普通方式打开对象所有方法),对于反射机制来说 .class文件在编译时时不可获取的,所有在运行时打开和检查.class文件
还有一个我们熟知的 代理模式 这个在后期会发表一下看法
- java学习笔记一 java类型信息(RITI和反射)
- Thinking in Java---类型信息和java反射机制学习笔记
- Java 反射学习笔记(一)
- Java反射机制学习笔记(一)
- java学习笔记-----类型信息
- 深入java--类型信息(反射)
- java反射学习笔记一(解析java.lang.String)
- java学习笔记---类型信息(type information)、反射机制与动态代理
- java反射---获取类型信息
- java学习笔记(一)--泛型与反射学习
- Java学习日常——运行时类型信息和反射
- Thinking in java学习笔记-类型信息
- Java 反射学习(一)
- Java反射之获取类的相关信息学习笔记(一)
- Java反射笔记一
- java 类型信息 笔记
- 「深入Java」类型信息:RTTI和反射
- 「深入Java」类型信息:RTTI和反射
- 在mac上搭建Android开发环境
- 干掉Inline-Block中间的空格
- 看Volley源码,对HTTP缓存机制分析
- android开发中使用Gson进行对象和Json之间的转换很方便
- Android studio DrawerLayout
- java学习笔记一 java类型信息(RITI和反射)
- (Inside Out) Web地图坐标系——TDT的神奇
- 有道词典Demo(WebView)
- 案例分析:基于消息的分布式架构
- Apache CXF框架简介
- 日经春秋 20150703
- Ubuntu14.04安装Gnu radio
- 图片浏览
- git命令查看、创建、切换、删除分支