Java基础:RTTI与反射

转载请注明出处:jiq?钦‘s
technical Blog

1 Class文件:

class文件全名称为Javaclass文件,主要在平台无关性和网络移动性方面使Java更适合网络。它在平台无关性方面的任务是:为Java程序提供独立于底层主机平台的二进制形式的服务。

每一个类都有一个Class类型的对象,每当一个类被编译,就会产生一个Class对象(保存在同名的.class文件中);

2 Class文件加载时机:

运行时按需加载。

与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM,然后再根据需要在运行时把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。

三种情况会触发Class Loader动态加载class对象到JVM:

(1)第一次静态方法被调用;

(2)第一次被new实例化;

(3)包含静态代码块;

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

3 RTTI三种表现形式:

Java是借助Class对象来实现RTTI机制的,java中RTTI有三种表现形式:

1).传统的类型转化。

如Base类是Subclass类基类。

Base base = newSubclass();

Subclass sub=(Subclass)base;//由RTTI确定类型转化正确性

2).通过代表对象的类型的Class对象可以获取运行时所需的信息。

3).关键字“instanceof”判断对象类型。

如:boolean yesOrNot = (baseinstanceof Subclass);

若base是Subclass类的实例,yesOrNot就为true。

4 RTTI限制:

书上流传一句话:RTTI和反射的区别是,对RTTI来说,编译器在编译时打开和检查.class文件,对于反射机制来说,.class文件在编译时是不可获取的,所以是在运行时打开和检查.class文件。

这个要怎么理解呢???

RTTI是在编译期间就已经知道了所有要处理的类型,但是有时运行时需要解析一个对象,比如你在磁盘文件或者网络中获取了一串字节,并被告知这些字节代表某一个类,但是很不幸代码中没有任何相关操作触发对应的class文件被加载到JVM,这就是所谓的运行时打开和检查.class文件。

5
反射机制

这时就需要通过显式告知JVM加载哪个class文件,以获取对应类型信息。

取得Class对象(若还未加载则先加载)的引用有两种方式:

(1)方法Class.forName("className")

(2) .class 类字面常量。

两者区别在于后者会将类的初始化(static区域的执行)推迟到后面对该类的静态域引用的时候;

Class<?>classObject = Class.forName("className");

Method[]methods = classObject.getMethods();

Constructor[]ctors = classObject.getConstructors();

由此可见,Class类是RTTI的基础,而Class类与java.lang.reflect类库一起对反射概念进行了支持。

6
反射的不安全性

即使你是面向接口编程,只提供出“希望可见的部分”给客户端,但是你仍然无法避免你的不可见的私有的,或者不是私有的一切方法被客户端使用的命运,你无法阻止这样的耦合。客户端通过反编译+反射机制就可以突破你的任何防线。但是如果有人这么干了,那这是他们的责任。

7 Spring中的依赖注入

Spring中的依赖注入就是依靠反射机制才得以实现的。

首先Spring会读取器配置文件中配置的那些bean,然后获取其要注入的对象的类名,这样就可以根据:

Classs bean = Class.forName("className");

Objectoo = bean.newInstance();

这样就创建好了一个待注入的类的对象。

我们利用反射机制一样可以获取注入目标Action的所有方法,包括其setXXX方法,因此我们接下来便可以通过调用

Method#invoke(方法名称,参数)这个方法来将创建好的对象注入进去了。

8 利用反射机制创建实例:

(1) 创建普通实例:

(2) 创建一维数组:

(3) 创建二维数组:

时间: 2024-10-26 17:15:50

Java基础:RTTI与反射的相关文章

Java基础13:反射与注解详解

Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Oracle官方对反射的解释是 Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fi

Java 基础篇之反射

Java 基础篇之反射 反射# 使用反射获取程序运行时的对象和类的真实信息. 获取 Class 对象# 每个类被加载之后,系统会为该类生成一个对应的 Class 对象,通过该 Class 对象可以访问到 JVM 中的这个类. 使用 Class 类的 forName(String clazzName) 静态方法.字符串参数的值是某个类的全限定类名,必须包含完整的包名 调用某个类的 class 属性 调用某个对象的 getClass() 方法.该方法是 java.lang.Object 类中的一个方

java之RTTI和反射的理解

最近在读 Thinking in Java 这本书.读到类型信息这一张时,刚开始对书中所说的RTTI和反射彻底混了,不知道有什么联系,有哪些相同点和区别.于是在网上又找了些内容辅助理解,这一章又重新读了一遍,对上面的这些疑问有了自己的答案,想到RTTI和反射时,脑海中有了自己的轮廓. 它俩的目的一样: 在运行时,识别对象和类的信息. 相同点: 目的相同: 功能都是通过Class类来实现的 不同点: RTTI:(主要作用在多态中,比如参数传递) 它假定我们在编译时已经知道所有类型,会打开和检查所有

学习Spring必学的Java基础知识(1)----反射

引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.): [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http://www.iteye.com/topic/1123293 [3] 属性

学习Spring必学的Java基础知识(1)----反射(转)

引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.): [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http://www.iteye.com/topic/1123

java的RTTI和反射机制

RTTI,即Run-Time Type Identification,运行时类型识别.它假定我们在编译时已经知道了所有的类型.那么在运行时就能够自动识别每个类型. 很多时候需要进行向上转型,比如Base类派生出Derived类,但是现有的方法只需要将Base对象作为参数,实际传入的则是其派生类的引用.那么RTTI就在此时起到了作用,比如通过RTTI能识别出Derive类是Base的派生类,这样就能够向上转型为Derived.类似的,在用接口作为参数时,向上转型更为常用,RTTI此时能够判断是否可

java基础--接口与反射总结

一.接口 接口中所有的方法默认public static final,不必再写. 接口中可以定义常量,但不能含有实例域.在java SE8之前,不能在接口中实现方法. 一个类可以实现多个方法implements 接口1,接口2...多个接口之间用","隔开. 克隆:要实现克隆先实现Cloneable接口,重新定义clone方法,并指定public修饰符. 默认clone是浅克隆,要实现深克隆需要自己重写clone. 所有的数组类型都有一个public的clone方法. 二.反射 概念:

java基础11(反射)

1.类加载器 a.类的加载: 定义:当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 一个类在加载过程中的三部曲: A.加载 : 就是指将class文件读入内存,并为之创建一个Class对象. 任何类被使用时系统都会建立一个Class对象. B.连接: 验证 是否有正确的内部结构,并和其他类协调一致 准备 负责为类的静态成员分配内存,并设置默认初始化值 解析 将类的二进制数据中的符号引用替换为直接引用 C.初始化 b.类的加载时机:

【Java基础总结】反射

1. 什么是反射 Class.Method.Field.Constructor,它们是反射对象.它们是类.方法.成员变量.构造器,在内存中的形式. 也就是万物皆对象!类是类型.方法是类型.成员变量是类型.构造器也是类型. 可以把Class当作类的元神:Method是方法的元神:Field是成员的元神:Constructor是构造器的元神. 得到了元神就可以来操作宿主. 2. 获取Class类的对象 Class表示一个类型,即描述类的类型. * 类名.class:Class c1 = Object

Java基础加强之反射

1.什么是反射? 反射其实就是动态的加载类,我们在写JDBC的时候加载驱动Class.forName("xxx")时就涉及到了反射. 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 2.反射机制能做什么? 1. 在运行时判断任意一个对象的所属的类Class. 2. 在运行时判断构造任意一个类的对象Constructor. 3. 在运行