Java反射

反射的使用:

反射通常被引用在那些需要可以检测或者修改运行时的行为或者在JAVA虚拟机中运行的应用的程序中。这是一个相对先进的功能,应该只有那些掌握了语言基础知识的开发人员才能使用。考虑到这一点,反射是一种强大的技术,可以使应用程序执行本来不可能的操作。

可扩展性功能:

应用程序可以通过使用完全限定名称创建可扩展性对象的实例来使用外部的用户定义类。

类浏览器和可视化开发环境:

类浏览器需要能够枚举类的成员。可视化开发环境可以从利用反射中可用的类型信息中受益,以帮助开发人员编写正确的代码。

DEBUG和测试工具

DEBUG需要可以检测类中的私有成员。测试工具可以利用反射系统地调用类上定义的可发现的set API,以确保测试套件中的高级代码覆盖率。

反射的缺点:

反射是很强大的,但是不应该随意使用。如果有可能的话一个操作的执行最好不要使用反射,最好是避免使用它。通过反射访问代码时,应牢记以下问题。

过度使用

由于反射涉及动态解析的类型,因此无法执行某些Java虚拟机优化。 因此,反射操作的性能低于非反射操作,并且应避免在性能敏感应用程序中频繁调用的代码段中。

安全限制

反射需要运行时权限,在安全管理器下运行时可能不存在。 对于必须在受限安全上下文中运行的代码,例如在Applet中,这是一个重要的考虑因素。

内部接触

由于反射允许代码执行在非反射代码中非法的操作,例如访问私有字段和方法,因此使用反射可能导致意外的副作用,这可能导致代码功能失常并可能破坏可移植性。 反射代码打破了抽象,因此可能会通过升级平台来改变行为。

小道教训

此跟踪包含用于访问和操作类,字段,方法和构造函数的反射的常见用法。 每课包含代码示例,提示和疑难解答信息

类:

这个里面展示了通过多种方式来获取一个Class对象,并且使用他来检测这个类的属性,包括他的声明和内容。

每个类型要么是一个引用要么是基本类型。类类型,枚举类型,数组,这些都是继承自java.lang.Object类,同时接口也是引用类型。引用类型的例子包含java.lang.String,基础类型的所有包装类,比如java.lang.Double,接口java.io.Serializable,和枚举类型,javax.swing.SortOrder。这里有一个基础类型的固定列表:boolean,byte,short,int,lang,char,float,double。

对于对象的每种类型,java虚拟机实例化一个java.lang.Class不可变的实例,提供了检测运行时的对象属性包含它的成员和类型信息。Class类也具有提供创建新类型和对象的能力。最重要的是,他是Reflection API的入口,包含了最通用的使用反射操作相关的类。

检索类对象,描述了获取一个Class的方法

检测类的修改器和类型 展示了如何访问一个类的声明信息

发现类的成员,解释如何取到一个类的构造方法,域,方法和内部类

故障排查 描述了在使用Class类的时候遇到的共通的错误

成员:

这个里面描述了如何使用Reflection API来查找一个类域,方法,构造方法。示例中包含值域的set和get方法,回调方法,创建一个新的对象实例使用具体的构造方法。

Reflection API定义了一个接口,java.lang.reflect.Member,它是由下面几个实现的,java.lang.reflect.Field,java.lang.reflect.Method,java.lang.reflect.Constructor。这些对象都会在该部分讨论。对于每一个成员,本课程将描述用于检索声明和类型信息的关联API,以及该成员特有的任何操作。(例如:给一个域set值或者调用方法)通常会遇到错误。每个概念都会被用代码示例来解释和相关输出接近一些预期的反射用途。

域一般是有一个类型和一个值,java.lang.reflect.Field类提供了方法在一个给定对象中来访问类型信息和设置获取一个域的值。

获取域的类型 描述如何来获取一个域声明的原始类型

检索和解析字段修饰符展示如何获取部分字段声明,如public 或transient

获取和设置域的值 解释如何访问域的值

故障排查 : 描述了一些可能引起混淆的常见编码错误

方法

方法有返回值,参数,也可能抛出异常。java.lang.reflect.Method类提供了方法来获取参数和返回值的类型信息。也可以被用在指定对象上进行方法回调。

获取方法类型信息:展示了如何枚举类中声明的方法并获取类型信息

获取方法参数的名字 演示了如何检索方法或构造函数参数的名称和其他信息

检索和解析方法修饰符描述了如何访问和解码修饰符以及与该方法相关的其他信息

调用方法说明了如何执行方法并获取其返回值

故障排除包括查找或调用方法时遇到的常见错误

构造函数的Reflection API在java.lang.reflect.Constructor中定义,与方法类似,有两个主要的例外:第一,构造函数没有返回值; 第二,调用构造函数为给定的类创建一个对象的新实例。

查找构造器 说明了如何检索具有特定参数的构造函数

检索和解析构造函数修饰符显示如何获取构造函数声明的修饰符以及有关构造函数的其他信息

创建新的类实例,如何通过调用其构造函数来实例化对象的实例

故障排除描述了在查找或调用构造函数时可能遇到的常见错误

数组和枚举类型

这里介绍了两种特殊类型的类型,数组(在运行时生成)和枚举类型(定义了独一无二的对象实例)。示例代码展示了如何检索数组的组件类型以及如何设置和获取具有数组或枚举类型的字段。

从java虚拟机的层面来说,数据和枚举类型(或者枚举)只是类。对于数组类型和枚举类型,在Class类中有很多方法可以被使用。Reflection提供了少许具体的API来供数组和枚举类型使用。这里会使用一系列的代码样例来区分这些对象和其他的对象以及如何操作他们。不同的错误也会被检查。

数组

数组是一个由多个元素组成的类型,并且有自己的长度(但是这个长度并不是它的类型)。数组可以被整体操作或者单个操作。Reflection提供了Java.lang.reflect.Array类来为后者操作。

分辨数组的类型:描述如何确认是否一个类的成员的一个域是数组类型

创建新的数组:解释如何用简单和复杂的组件类型来创建数组的实例

获取和设置数组及他们的元素:展示如何访问数组类型域的类型及数组的元素

故障排除 包含了共通的错误和对程序的错误理解

枚举类型

枚举的处理方式与反射代码中的普通类非常相似。Class.isEnum()表示是否代表一个类和枚举, Class.getEnumConstants()检索定义在枚举中的常量域。java.lang.reflect.Field.isEnumConstant()表示一个域是否是枚举类型。

检查枚举类型:来说明如何检索一个枚举的常量或者其他的域,构造方法或者方法。

给枚举类型设置和获取域:如何用枚举常量值来对域进行设值和取值

故障排除描述了与枚举相关的共通的问题

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值