最近在看JAVA WEB开发方面的资料,看到有如果一段话:servlet容器(tomcat)在启动时或有对servlet的访问时加载servlet,tomcat通过java反射机制实例化servlet即:class.foreName("HelloWorld")
我想问的是servlet是我们自己定义的一个类,那为什么我们自己定义的类还得用反射机制去实例化呢?
也找了许多JAVA反射机制的原理看过,但大多举的是如下一些个例子:自己先创建一个类,然后再通过反射机制来实例化这个类。说实话我觉得他们都没有描述清楚为什么要用反射机制,或者说reflection到底有什么用,是在类的引用上可以走捷径?或是出于其它什么目的?.....。试想一下如果没有什么特殊用处,谁会自己创建一个类,然后再用这样的反演规则实例化这个类
呢?那不是脱了裤子放屁吗(呵,不该说粗话)?
关于JAVA 反射机制谁能描述清楚其实质性的作用?
答案:4 悬赏:50 手机版
解决时间 2021-02-28 04:59
- 提问者网友:皆是孤独
- 2021-02-27 13:58
最佳答案
- 五星知识达人网友:想偏头吻你
- 2021-02-27 15:05
通过反射机制实例化这个类,是使用描述这个类的一个字符串来实例化它的对象。
如果直接用 new 关键字实例化,你就要在写程序的时候,写死要实例化的是哪个类的对象。
通过反射机制,就可以有一个配置文件读取要实例化的类的描述字符串,可以是xml也可以是文本文件。 这样用户改变了配置文件中的字符串,就能让你的程序在运行的时候去实例化不同的类的实例。
就比如spring的AOP就是用这个反射机制实现的。。
上面我说这个只是举一个反射的应用例子,告诉你它不是“脱了裤子放屁”,它是真的有用。
其实它还有挺多场景的应用,不一一列举。。
如果直接用 new 关键字实例化,你就要在写程序的时候,写死要实例化的是哪个类的对象。
通过反射机制,就可以有一个配置文件读取要实例化的类的描述字符串,可以是xml也可以是文本文件。 这样用户改变了配置文件中的字符串,就能让你的程序在运行的时候去实例化不同的类的实例。
就比如spring的AOP就是用这个反射机制实现的。。
上面我说这个只是举一个反射的应用例子,告诉你它不是“脱了裤子放屁”,它是真的有用。
其实它还有挺多场景的应用,不一一列举。。
全部回答
- 1楼网友:持酒劝斜阳
- 2021-02-27 17:41
主要就是 你写一个类实例化后可以看到填它里面的方法
再看看别人怎么说的。
- 2楼网友:行雁书
- 2021-02-27 16:38
Tomcat 的启动过程为什么要放在Bootstrap 和Catalina 两个类中呢?而且,Bootstrap 还 是通过反射机制调用Catalina ,感觉上是在走弯路。
《How Tomcat Works》 第17 章的开头提到这个问题。
This chapter focuses on Tomcat startup using two classes in the org.apache.catalina.startup package, Catalina and Bootstrap. The Catalina class is used to start and stop a Server object as well as parse the Tomcat configuration file, server.xml. The Bootstrap class is the entry point that creates an instance of Catalina and calls its process method. In theory, these two classes could have been merged. However, to support more than one mode of running Tomcat, a number of bootstrap classes are provided. For example, the aforementioned Bootstrap class is used for running Tomcat as a stand-alone application. Another class, org.apache.catalina.startup.BootstrapService, is used to run Tomcat as a Windows NT service.
理论上,这两个类是可以合并的。但是,为了支持以多种方式 启动,Tomcat 将启动的核心逻辑(即Catalina 类)和不同启动方式 (比如 Bootstrap类)分开,并且通过提供多种Bootstrap来实现不同的启动方式。
目前,Tomcat 共支持三种启动方式:
作为独立的程序,从命令行启动
作为嵌入式程序,从其他进程中启动
作为Windows 服务,自动启动
在Tomcat 5.5 中:
第一种启动方式就是由Bootstrap类和Catalina类实现
第二种启动 方式是由org.apache.catalina.startup.Embedded 类 实现的(其实Catalina 类就是Embedded的子类)
第三 种启动方式仍然由Bootstrap类和Catalina类实现
不过,在Tomcat 4.x 中,第三种启动方式由专门的Bootstrap Service类和Catalina Service 类来实现的。
可见,Tomcat 的发展历史中,还是体现了“Bootstrap 和Catalina 分 离,Bootstrap 封装不同启动方式”的策略。但是,现在的代码看,这个分离已经不是很清楚。
- 3楼网友:一袍清酒付
- 2021-02-27 15:32
1)当你做一个软件可以安装插件的功能,你连插件的类型名称都不知道,你怎么实例化这个对象呢?
因为程序是支持插件的(第三方的),在开发的时候并不知道 。所以,无法在代码中 New出来 ,但反射可以,通过反射,动态加载程序集,然后读出类,检查标记之后再实例化对象,就可以获得正确的类实例。
2)在编码阶段不知道那个类名,要在运行期从配置文件读取类名, 这时候就没有办法硬编码
new ClassName(),而必须用到反射才能创建这个对象.
反射的目的就是为了扩展未知的应用。比如你写了一个程序,这个程序定义了一些接口,只要实现了这些接口的dll都可以作为插件来插入到这个程序中。那么怎么实现呢?就可以通过反射来实现。就是把dll加载进内存,然后通过反射的方式来调用dll中的方法。
很多工厂模式就是使用的反射。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯