通过Web环境中的反射实例化对象

时间:2013-05-03 19:59:50

标签: java reflection instance

我需要通过Java反射api实例化几个类,并在实例化的类中调用'a'方法(不通过反射调用方法)。我知道反射会影响应用程序的性能,但我不确定它对Web环境的影响有多大!就像使用反射实例化Action类的Struts框架一样,我的框架也将类名称作为文件中配置的字符串获取,我在不同的请求中读取并实例化。每个类只有一个实例并为每个请求调用其方法的想法怎么样? 例如,

package com.app.events;
public class event1 implements iEvent {
     public event1() {
     }

     public void doprocess(Object info) {
        // do necessary events
     }
}
package com.app.events;
public class event2 implements iEvent {
     public event1() {
     }

     public void doprocess(Object info) {
        // do necessary events
     }
}

config.xml
<events>
  <event>com.app.events.Event2</event>
  <event>com.app.events.Event1</event>
</events>
// servlet init
String clazName = parseXMLFile(); // not every time but only once, I have the bean
Class claz = Class.forName(clazName);

// how about this?
// I save this instance for later requests
events.put(request.getParameter("event"), claz.newInstance());

// later requests,I retrieve the event from the map and invoke its method, 
// just a rough code...
events.get(request.getParameter("event")).doprocess(info);

1 个答案:

答案 0 :(得分:0)

首先,首先要尊重Java命名约定。类是CamelCased,方法是camelCased。

使用单个实例非常好。这就是servlet的功能,以及Struts1操作和Spring bean(默认情况下)。但是这应该记录下来,因为它会强制你的接口的每个实现都是线程安全的(最好是无状态),除非你的框架确保一次只有一个线程使用每个实例,这会大大降低你的性能。应用

许多年前创建的许多实例都很慢。它现在不再存在,所以我每次都会创建一个新实例,除非单个实例很重要(因为初始化实例可能很慢)。