文档章节

Java反射实战中文翻译

phli
 phli
发布于 2015/10/14 23:37
字数 909
阅读 37
收藏 0

link:https://www.gitbook.com/book/lawr/jreflection

Chapter 1. 一些基本概念

我们通常会遇到一些可以用反射轻松及优雅地解决的问题。没有反射机制,我们的解决方式会显得杂乱、累赘和脆弱。例如下面的场景:

1.你的项目经理提出一个可插拔的框架,并知道系统在生成和部署之后还需要接受新的组件。
你创建了一些接口并准备了一个给你的jar包打补丁的方法,但不能完全满足可插拔的需要。
2.在花费了数个月去部署一个客户端应用后,市场营销人员告诉你用另一种远程机制能够提高
销量。即使做转换是一个好的商业策略,你现在得重新实现所有远程接口。
3.你的模块的公用接口只想接收来自特定包的调用,以免他人错误使用你的模块。你为每一个
API增加了一个参数来保存调用类的包名。但是这样做,合法的调用方得修改他们的调用了,并
且不合法的调用方可以伪造一个包名来调用你的API。

这些场景分别说明了模块化、远程调用和安全,并且看起来没有相似之处。然而它们有这样的共同点:每个场景都需要做出改变,并且需要得由基于程序架构的决策和代码修改来满足。

重新实现接口、给JAR打补丁或者修改方法调用是单调乏味和机械的。乏味到你可以写一个算法来描述必须的步骤:

1、检查程序的结构和数据。 2、根据检查结果做方案 3、根据方案修改程序的行为、结构或数据

尽管对于程序员的你这些步骤看起来满熟悉的,但你无法想象一个程序来完成这些任务。于是你假定修改代码得由一个坐着敲代码的人来完成,而不是在机器里跑着的程序。等学习了反射之后,你可以抛弃这个假想,并让程序帮你做这些调整了。举下面一个简单的例子:

public class HelloWorld {
    public void printName() {
        System.out.println(this.getClass().getName());
    }
}

该行

(new HelloWorld()).printName();

发送字符串 HelloWorld 到标准输出。设 x 为HelloWorld类或其子类的一个实例,这一语句

x.printName();

发送了该类名称的字符串到标准输出。 这一简单的例子比它看上去的要激动人心。它包含了前面所说的每一个步骤。printName 方法检查了这个对象的类(this.getClass())这样,应该输出什么的决策就转交给了这一对象的类。该方法依据决策来执行——输出类的名称。不需要通过重载,printName方法就可以为不同的子类做出和与HelloWorld类不同的表现。这一方法很灵活,它可以适应继承它的类,并产生表现得变化。在后续我们会利用更复杂的例子来介绍使用反射来获得灵活性的方法。


© 著作权归作者所有

共有 人打赏支持
phli
粉丝 0
博文 4
码字总数 2048
作品 0
深圳
私信 提问
Effective Go 中英双语版

Effective Go - 《实效 GO 编程》 Introduction Go is a new language. Although it borrows ideas from existing languages, it has unusual properties that make effective Go programs ......

兵戈天下
2016/08/13
895
3
图说 Java:理解 Java 机制最受欢迎的 8 幅图

世间总是一图胜过千万言,下面的8幅图来自于 Program Creek 的 Java教程 ,目前这是该网站最受欢迎的文章. 希望本文能帮你回顾你已经知道的那些知识。如果图片讲解的不够清晰,你可能需要阅读详...

大数据之路
2013/10/30
0
3
免费的编程中文书籍索引

免费的编程中文书籍索引,欢迎投稿。 国外程序员在 stackoverflow 推荐的程序员必读书籍,中文版。 stackoverflow 上的程序员应该阅读的非编程类书籍有哪些? 中文版 github 上的一个流行的编...

modernizr
2014/04/08
7.3K
24
Elasticsearch 5.6 Java API 中文手册

Elasticsearch 5.6 Java API 中文手册 由 全科 翻译,并且整理成电子书,支持PDF,ePub,Mobi格式,方便大家下载阅读。 不只是官方文档的翻译,还包含使用实例,包含我们使用踩过的坑 阅读地址...

woquanke
2017/11/09
0
0
细说 Java 中的字符和字符串( 二 )

原文出处:BuquTianya 我们上次在《细说Java中的字符和字符串(一)》说了Java中char和中文字符之间的关系,说明了char能不能存储一个中文字符,以及如何判断Java的字符串是否包含中文字符。...

BuquTianya
2018/06/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

给windows server中的“未识别的网络”或“无法识别的网络”设置网络位置类型

在windows server中,如果网络没有被正确的识别,那么就需要手工设置一下网络位置类型。 将“公用网络”指定设置为“专用网络“ 【控制面板】--【系统和安全】--【管理工具】--【本地安全策略...

gugudu
48分钟前
1
0
阿里强制要求的21条Java开发规范,可以避免很多坑

1. 【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。 2. 【强制】所有的覆写方法,必须加@Override注解。 说明:getObject...

天王盖地虎626
今天
7
0
oracle dg 备库未设置convert参数导致ORA-01111,ORA-01110

查看trace 文件: MRP0: Background Managed Standby Recovery process started (amls) started logmerger process Sun Jan 20 07:55:53 2019 Managed Standby Recovery starting Real Time ......

hnairdb
今天
2
0
乱入Linux界的我是如何学习的

欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux。 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在...

linux-tao
今天
2
0
乱入Linux界的我是如何学习的

欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux。 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在...

linuxprobe16
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部