【问题标题】:Performance with URLCLassLoader with jar files带有 jar 文件的 URLCLassLoader 的性能
【发布时间】:2016-09-23 09:06:35
【问题描述】:

我已经实现了一个插件基础设施:

a>war 文件:这个war 文件具有从文件系统动态加载jar 文件的类。

b> Jar 文件:它们被放置在一个文件系统中,将被上面的 war 文件使用。

我担心每天都会调用很多 jar 文件。我的设计是正确的还是有改进的余地? 它将如何影响war文件的性能?

战争文件控制器类:

public class PluginController {

/**
 * This method is used to invoke plugin class dynamically
 * @param requestBean : This object contains all parameter to
 * complete the request
 * @return responseBean : This object contains the response from vendor
 */
public ResponseBean invokePlugin(RequestBean requestBean){
    URLClassLoader urlClassLoader = null;
    ResponseBean responseBean = null; 
    Map<String, String> parameters = marshalRequest(requestBean);
    try {
        urlClassLoader = new URLClassLoader(new URL[]{new URL("file:///C:/Users/jamju02/Desktop/today/otp.jar")});
        if(urlClassLoader != null){
             Class pluiginClass = urlClassLoader.loadClass("com.ca.pas.plugin.bean.PluginTest");

             if(pluiginClass != null){
                // Create a new instance from the loaded class
                 Constructor<?> constructor = pluiginClass.getConstructor();

                Object classobject = constructor.newInstance();
                    Method method = pluiginClass.getDeclaredMethod("sendOTP", Map.class);
                    method.setAccessible(true);
                    responseBean = (ResponseBean) method.invoke(classobject, parameters);
             }else{
                 System.out.println("class file name not found in jar file");
             }

        }else{

        }



    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }finally{
        try {
            if(urlClassLoader != null){
                urlClassLoader.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return responseBean;
}


public Map<String, String> marshalRequest(RequestBean requestBean){

    Map<String, String> parameters = new HashMap<>();
    parameters.put("TXN_ID", requestBean.getTxnId());
    parameters.put("BANK_ID", requestBean.getBankId());
    parameters.put("RANGE_ID", requestBean.getRangeId());
    parameters.put("CARD_NUMBER", requestBean.getCardNumber());
    parameters.put("CARDHOLDER_NAME", requestBean.getCardholderName());
    parameters.put("OTP", requestBean.getOrb().getOtp());
    parameters.put("MOBILE_NUMBER", requestBean.getOrb().getMobileNumber());
    parameters.put("EMAIL", requestBean.getOrb().getEmailAddress());
    return parameters;
}

}

================================================ ===================================

Jar 文件类有一些内容可以调用 Web 服务。

【问题讨论】:

  • 提示:如果您正在寻找工作代码的审查,请考虑转向 codereview.stackexchange.com ...

标签: java jar urlclassloader


【解决方案1】:

看起来很适合我。

我没有看到整个系统设计,但如果您可以将类加载器实例保存在对象/类变量中会更快。也许可以将 Controller 类设计为 singleton

通过使用不带任何参数的基本构造函数,那么只使用不带构造函数的pluinClass.newInstance() 就足够了。 请注意,如果调用的方法定义为 public,则不需要使用setAccessible(true)

【讨论】:

    猜你喜欢
    • 2010-10-22
    • 2019-02-08
    • 2013-05-13
    • 2011-11-18
    • 1970-01-01
    • 2012-04-27
    • 2011-05-18
    • 2011-08-26
    • 2016-11-01
    相关资源
    最近更新 更多