关于Tomcat中的反射机制的问题

Q_Yay 2014-08-18 04:26:31
 /**
* Initialize daemon.
*/
public void init()
throws Exception
{

// Set Catalina path
setCatalinaHome();
setCatalinaBase();

initClassLoaders();

Thread.currentThread().setContextClassLoader(catalinaLoader);

SecurityClassLoad.securityClassLoad(catalinaLoader);

// Load our startup class and call its process() method
if (log.isDebugEnabled())
log.debug("Loading startup class");
Class startupClass =
catalinaLoader.loadClass
("org.apache.catalina.startup.Catalina");
Object startupInstance = startupClass.newInstance();

// Set the shared extensions class loader??????????????
if (log.isDebugEnabled())
log.debug("Setting startup class properties");
String methodName = "setParentClassLoader";
Class paramTypes[] = new Class[1];
paramTypes[0] = Class.forName("java.lang.ClassLoader");
Object paramValues[] = new Object[1];
paramValues[0] = sharedLoader;
Method method =
startupInstance.getClass().getMethod(methodName, paramTypes);
method.invoke(startupInstance, paramValues);

catalinaDaemon = startupInstance;

}

上面这段代码是tomcat的Bootstrap.java中的init()函数的,相信研究过tomcat的人都应该看过这个,我就不再解释了。
我的问题是,既然在Object startupInstance = startupClass.newInstance();这已经获得了Catalina类的实例了,为什么在下面不直接调用那个方法,而要使用反射调用呢?
...全文
246 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qingyuan18 2014-08-18
  • 打赏
  • 举报
回复
Class startupClass = catalinaLoader.loadClass ("org.apache.catalina.startup.Catalina"); ---现在是org.apache.catalina.startup.Catalina,升版或者未来改变后,不是这个class了,那你后续直接调用实例的代码都要变 用代理机制,只需要改class的类路径,以及启动的method名字,调用方法都交给invoke,实现类似配置化的功能
Q_Yay 2014-08-18
  • 打赏
  • 举报
回复
你好,习惯就好了的意思是,直接用那个实例调用方法也是可以的? 难道这样写就没有说是类加载方面的问题吗,我看这个启动文件很多都是围绕着classloader来的,是不是考虑到类的加载,所以写成这样的?
zhjdg 2014-08-18
  • 打赏
  • 举报
回复
习惯了就好。 我想::::::: 依赖注入。 依赖注入的框架应该是这样写的。 或许他等着某一天写到xml上,写到annotation上.

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧