JAVA动态编译.jar文件

package sc.app.stc.dist.sdk.utils.jartool;


import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JarHelper
{
  public static List<String> GetJarClassName(String path, String filter)
    throws Exception
  {
    List lt = new ArrayList();
    String filePath = URLDecoder.decode(path, "UTF-8");
    if (filePath.endsWith(".jar"))
    {
      JarFile file = new JarFile(filePath);
      Enumeration entrys = file.entries();
      while (entrys.hasMoreElements()) {
        JarEntry jar = (JarEntry)entrys.nextElement();
        String fileName = jar.getName();
        if (fileName.endsWith(".class")) {
          String temp = fileName.replace(".class", "").replace('/', 
            '.');
          boolean status = true;
          if (filter.length() > 0) {
            Pattern pattern = Pattern.compile(filter);
            Matcher matcher = pattern.matcher(temp);
            status = matcher.matches();
          }
          if (status) {
            lt.add(temp);
          }
        }
      }
      file.close();
    }
    return lt;
  }
 
}
package sc.app.stc.dist.sdk.utils.jartool;

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;

public class ExternalJarClassLoader extends URLClassLoader
{
  public ExternalJarClassLoader()
  {
    super(new URL[0], ClassLoader.getSystemClassLoader());
  }

  public void AddURL(String jarPath) {
    try {
    	URL url = new File(jarPath).toURI().toURL();
      addURL(url);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public Class<?> GetExternalClass(String classPath) {
    try {
    	 
      return loadClass(classPath);
    } catch (Exception e) {
      e.printStackTrace();
    }return null;
  }
}
package sc.app.stc.dist.sdk.utils.jartool;

import java.util.ArrayList;
import java.util.List;

public class ClassLoaderHelper
{
  static ExternalJarClassLoader ejcl = null;
  static List<String> jarPathList = new ArrayList();

  public static Class<?> GetExternalClass(String jarPath, String classPath) {
    if (ejcl == null) {
      ejcl = new ExternalJarClassLoader();
    }
    if (!jarPathList.contains(jarPath)) {
      ejcl.AddURL(jarPath);
    }
    return ejcl.GetExternalClass(classPath);
  }
}
package sc.app.stc.dist.sdk.utils.javatool;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import sc.app.stc.dist.sdk.strategy.IStrategy;
import sc.app.stc.dist.sdk.utils.jartool.ClassLoaderHelper;
import sc.app.stc.dist.sdk.utils.jartool.JarHelper;

public class JavaBuildHandler<T> {

	private Logger logger = LoggerFactory.getLogger(JavaBuildHandler.class.getName());
	private List<T> Values = new ArrayList<T>();

	public JavaBuildHandler() {

	}
//循环.jar 中的class文件,编译每个class文件到内存中

	@SuppressWarnings("unchecked")
	public synchronized List<T>  buildAllClass(String javaPath) {
		File rootFile = new File(javaPath);
		String fullName = "";
		if (rootFile.isDirectory()) {
			String[] fileNames = rootFile.list();
			for (String filename : fileNames) {
				fullName = javaPath + "/" + filename;
				String[] packageName = readJavcSourceCode(fullName);
				if (packageName != null) {
					try {
						T tObject = (T) DynamicEngine.getInstance().javaCodeToObject(packageName[0], packageName[1]);
						if (tObject != null)
							Values.add(tObject);
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
//编译.java文件
		} else if (rootFile.getName().endsWith(".java")) {
			fullName = javaPath;
			String[] packageName = readJavcSourceCode(fullName);
			if (packageName != null) {
				try {
					T tObject = (T) DynamicEngine.getInstance().javaCodeToObject(packageName[0], packageName[1]);
					if (tObject != null)
						Values.add(tObject);
				} catch (Exception e) {
					logger.error("buildAllClass faild, {}", e);
				}
			}
//编译.jar文件
		}else if(rootFile.getName().endsWith(".jar")) {
			fullName = javaPath;
			 try {
				List<String> lt=JarHelper.GetJarClassName(fullName, "");
				for (String className : lt) {
			     
			        Class<?> clazz = ClassLoaderHelper.GetExternalClass(fullName, 
			          className);
			        if (clazz == null) {
			          continue;
			        }
			        if( IStrategy.class.isAssignableFrom(clazz)) {
			        	T tObject=(T) clazz.newInstance();
			        	if (tObject != null)
							Values.add(tObject);
			        }
				}
			} catch (Exception e) {
				logger.error("buildAllClass faild, {}", e);
			}
		}
		return Values;
	}

//读取包名和java代码
	private String[] readJavcSourceCode(String path) {
		String packageName = "";
		String line = null;
		BufferedReader buffRead = null;
		StringBuffer buff = new StringBuffer();
		File file = new File(path);
		if (!file.isFile() || !file.getName().endsWith(".java")) {
			return null;
		}
		try {

			buffRead = new BufferedReader(new FileReader(file));
			while ((line = buffRead.readLine()) != null) {
				line = line.trim();
				buff.append(line).append("\r\n");
				if (line.startsWith("package")) {
					packageName = line.replace("package", "").replace(";", "").trim();
					// break;
				}
			}
		} catch (Exception e) {
			logger.error("readJavcSourceCode faild, {}", e);
			return null;
		} finally {
			if (buffRead != null)
				try {
					buffRead.close();
				} catch (IOException e) {
				}
		}
		if (packageName.length() > 0) {
			packageName += ".";
		}
		packageName += file.getName().replace(".java", "");
		logger.info("packageName:{}", packageName);
		return new String[] { packageName, buff.toString() };
	}
}
JarHelper ,ExternalJarClassLoader ,ClassLoaderHelper 直接复制下来,不需要改,调用
JavaBuildHandler.buildAllClass ,传入.jar的路径就可以把.jar放入内存中,可以与java动态编译.java文件结合使用 java 动态编译_无奈的码农的博客-CSDN博客在java项目内获取整个电脑任意位置的.class文件进行实例化,执行以下案例时,需要从jdk中引入tool.jar 文件第一种:使用urlclassloader进行package test;import java.net.URL;import java.net.URLClassLoader;/** * @ClassName Test * @Description * @Date 2021/11/26 11:06 **/public class TestURLClassLoadhttps://blog.csdn.net/qq_27566167/article/details/121564792?spm=1001.2014.3001.5502

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无奈的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值