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