.class文件的加载并且调用里面的方法

最近应经理要求,写一个动态加载的功能,根据不同公司的业务调用不同的算法

  具体实现如下:1.上传.class(算法)文件

         2.启用文件 加载文件

         3.传值,调用文件中的方法,获取更加算法得到的返回值

         4.将数据放入数据库

 此功能需定时执行

 

 

第一步 第二步和第四步实现比较简单

如图所示

 

具体谈谈第三步,如何调用状态为启用的.class文件,并执行其方法获取返回值

1.首先自定义一个加载器MyClassLoader

public class MyClassLoader extends ClassLoader {
    //类加载器的名称  
    private String name;  
  
    public MyClassLoader(String name) {  
        this.name = name;  
    }  
      
    MyClassLoader(ClassLoader parent, String name) {  
        super(parent);  
        this.name = name;  
    }  
    /** 
     * 重写findClass方法 
     */  
    @Override  
    public Class<?> findClass(String name) {  
        byte[] data = loadClassData(name);  
        return this.defineClass(name, data, 0, data.length);  
    }  
    public byte[] loadClassData(String name) {  
        try {  
            String path=this.getClass().getResource("/").getPath();//得到e:/tomcat/webapps/工程名WEB-INF/classes/路径
            name = name.replace(".", "//");  
            FileInputStream is = new FileInputStream(new File(path + name + ".class"));  
            ByteArrayOutputStream baos = new ByteArrayOutputStream();  
            int b = 0;  
            while ((b = is.read()) != -1) {  
                baos.write(b);  
            }  
            return baos.toByteArray();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return null;  
    }  
}

2.加载.class文件并执行方法

 //新建一个类加载器   MyClassLoader cl = new MyClassLoader("myClassLoader");  
 //加载类,得到Class对象  
 Class<?> c=cl.loadClass("com.creatsoft.corrosion.water.service.DynamicAlgorithmTest"); 
Class[] c2 = new Class[3];
                c2[0] = Double.class;
                 c2[1] = Double.class;
                  c2[2] = Double.class;
            Method m =  c.getMethod("calculate",c2);
                    
                    Object[] params = new Object[3];
                    params[0] = new Double(3d);
                    params[1] = new Double(4d);
                    params[2] = new Double(5d);
                    Double aa = (Double)m.invoke(c.newInstance(),params);
                    System.out.println("返回值======"+aa);

最后看一下我的.class文件的内容

package com.creatsoft.corrosion.water.service;

import java.io.PrintStream;

public class DynamicAlgorithmTest
{
  public Double calculate(Double voltage, Double instrumentvalue, Double samplevalue)
  {
    System.out.println("voltage=====" + voltage);
    System.out.println("instrumentvalue=====" + instrumentvalue);
    System.out.println("samplevalue=====" + samplevalue);
    System.out.println("有参数============================有参数");
    return Double.valueOf(5.0D);
  }
}

其中要注意的是 package com.creatsoft.corrosion.water.service;文件存放的位置不要弄错了

很简单,当然在定时执行的时候,还需要深一步的考虑,比如启动另一个算法的时候,你得去确保该方法以及执行完成,

如果未完成,需等待完成后再调用另外一个算法。。。。。。。

 

题外话:个人觉得算法应该不会经常变,如果经常变,那原来的数据怎么办,如果需改算法重新发布一下就好了,

经理也没说清楚为什么加这个功能,如遇大神,请提点一二,解开小弟心中谜团、、、、、、、

        

posted on 2014-12-05 15:45  路子哥哥  阅读(141)  评论(0)    收藏  举报

导航