帮我理解。
例如,反射的一个特定定义是这样说的:“反射是一种工具,通过它你可以找到关于一个类的所有信息:方法名、参数、字段、注释……”。
作为一个初学者,我有一个合理的疑问,如果类、方法、字段等不存在,为什么还需要查找这些信息?我自己写,知道他们的一切?
我知道反射没有用于我的课程等,但是我找不到一个初学者可以理解的真实例子:在什么情况下我会面临我不知道课程名称的事实、方法等?
与注解相同:“……一个允许您在源文件中嵌入帮助信息的工具……”。好吧,我会把它建进去,但利润是多少,我最终会借助它得到什么?注释的存在会给开发人员带来什么好处?他们如何让生活更轻松?
反射和注释使您能够解决原本可以通过手动单调编码或代码生成来解决的问题。
而且,当然,当它们被使用时,它们并不适用于特定的类,而是有一定的余量,甚至适用于您将来编写的那些类。它们通常用于在项目之间徘徊的库代码中,因此对这些项目的类一无所知。
几个具体的例子:
休眠注解
Hibernate 是一个 ORM,即一个用于方便地将数据库映射到目标代码的库。通常在基础代码和 Java 代码中使用不同的命名约定。为了让 Hibernate 了解将哪个字段复制到哪里,使用了注释。对于一张桌子:
可以应用注释:
该示例取自此处。简而言之,这里发生了什么:在数据库中,该字段被称为,例如,
first_name
在 Java 代码中 -firstName
。多亏了注解,当从数据库中加载记录到一个对象中时,Employee
该库将独立分散所有字段。Java编译器
编译器还使用注释进行额外检查或更改其在各个方法中的设置。见注解
@Override
和@SuppressWarnings
。Android注解
http://androidannotations.org/项目允许您通过实现常见任务并将它们包装在注释中来极大地简化 Android 代码的开发。这只是将在不熟悉的项目中工作的库代码的一个很好的例子。自然地,反射被积极地用于实现这段代码。“注释前”和“注释后”的示例直接在上面链接的主页上给出。
面向方面编程
我不会写太多关于他的内容,因为这个话题很大,对于初学者来说可能不是很有必要。但总的来说,AOP 就是这样。例如,您可以编写自己的类,然后负责检查权限,就像管理员可以删除记录,但普通用户不能。
使用经典方法,您必须对大量现有类进行相同类型的更改,然后记得对新类进行更改。在 AOP 中,您可以简单地提出注释
@Administrator
,并将它们放在所需的类和方法上。这也是单调的,但还是简单多了。@User
@Moderator
没有注释的反射
反射的使用更为频繁,例如,在各种模板引擎和映射器中。模板引擎允许您使用像这样的电子邮件模板:
然后你将一个带有字段的类传递给模板引擎
username
,amount
它会独立生成信件的文本。没有反思就无法完成这样的任务。结论
总的来说,反射和注解可以让你摆脱所谓的monkey coding,即单调的底层编码。
1)依赖注入框架往往基于反射
2) 按名称调用方法。假设您有一个方法名称作为输入,您可以这样调用它:
3) 类实例化也是一样。我们是在Unity3d上做游戏,这里虽然是C#,但是本质没有变。我们有一堆法术。可用法术列表作为数组。我们需要按名称实例化所需的类。要么
switch
用 heap做一个大块case
,要么只调用 1 种方法。4) 在反思的帮助下,如有必要,您可以触及课堂
final
领域protected
。例如,当我使用 Android 时,我经常需要这样做。SDK 中的许多类字段是隐藏的,您只能通过反射来获取和更改它们。PS 但尽可能避免使用反射,因为它本质上非常慢