8
回答
java中既然有封装,为什么要有个反射?这不是自己打自己嘴巴嘛,
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
java中既然有封装,为什么要有个反射?这不是自己打自己嘴巴嘛,封装就是为了把一些相关的属性和行为隐藏起来,搞个反射不就没有意义了嘛?求解为什么sun 公司这么做?目的何在?作用又何在?
举报
qjm201000
发帖于5年前 8回/2K+阅
共有8个答案 最后回答: 5年前

反射就是用来解决OO中遇到的问题,解决获知内部状态困难的问题。一般来说,只要是面向对象的语言都有反射(即我所知,只有C++例外,没有在语法上提供,这个和C+=更接近底层有关)

每种语言和设计模式都有自己的不足,如果这叫打脸的话,那全世界的语言的脸都被你打肿了。

不能手里有锤子,就看到什么都是钉子,工具只是让你多了一个选择

反射可以根据类名称动态生成对象,struts1 中的action用反射动态生成, tomcat根据web.xml中的配置用反射动态生成servlet对象,java的Proxy用反射生成被代理的类对象。。。
封装就不是为了把一些相关的属性和行为隐藏起来。封装只是把某类数据和逻辑组织到一起。而通过反射可以清楚的知道这些组织方式。
就像真实世界一样,我们需要把一些东西包装起来,给那些不用知道其内部结构的人用,这叫封装。而有时候又需要把一个东西的内部呈现出来,了解其构造,然后制造出相同的东西,这叫反射。 

请看官方文档: http://docs.oracle.com/javase/tutorial/reflect/index.html

摘一段:

Extensibility Features

An application may make use of external, user-defined classes by creating instances of extensibility objects using their fully-qualified names.

Class Browsers and Visual Development Environments

A class browser needs to be able to enumerate the members of classes. Visual development environments can benefit from making use of type information available in reflection to aid the developer in writing correct code.

Debuggers and Test Tools

Debuggers need to be able to examine private members on classes. Test harnesses can make use of reflection to systematically call a discoverable set APIs defined on a class, to insure a high level of code coverage in a test suite.

反射给我们提供了灵活性(通用性),但是影响性能。spring就是反射应用的一个例子。

例如,导出excel。这样一个基本的功能就可以用到反射。利用反射可以将写入excel部分和其他代码逻辑分离开。降低耦合,代码复用等等其他好处。

问这个问题,说明接触java时间还不多。

反射是为了能在运行时得到类、方法、属性等的信息。假设没有反射,Spring如何根据配置文件来做IoC,如何获取Annotation。这和封装有什么矛盾
顶部