动态加载一个或多个jar文件

1,使用

package com;
import java.io.File;
import java.net.URLClassLoader;

public class ClassLoad {
static URLClassLoader loader = null;
/**
  * 在默认的目录加载jar
  * @return
  */
public static URLClassLoader getClassLoad(){
if (loader == null) {
URLClassLoaderUtil urlClass = new URLClassLoaderUtil("d:\\test.jar", false);
loader = urlClass.getClassLoader();
}
return loader;
}
/**
  * 在给定的路径加载jar文件
  * @param url  指定路径
  * @param isFile  true 文件  false 目录
  * @return
  */
public static URLClassLoader getClassLoad(String url, boolean isFile){
URLClassLoaderUtil urlClass = new URLClassLoaderUtil(url, false);
URLClassLoader loader = urlClass.getClassLoader();
return loader;
  }
}


2,工具类


package com;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class URLClassLoaderUtil {
URLClassLoader classLoader = null;// URLClassLoader类载入器 
private String jarFileName; 
private boolean isFile = true; 
List<String> jars = new ArrayList<String>(0); 
/** 
* * 加载具体的某一jar包 
* * 
* * 
* @param jarFileName 

*/ 
public URLClassLoaderUtil(String jarFileName) 

this.setJarFileName(jarFileName); 
this.inti(); 

/** 
* * 加载jar包 当isFile为false是加载文件夹下所有jar 
* * 
* * 
* @param jarFileName 
* * 路径 
* * 
* @param isFile 

*/ 
public URLClassLoaderUtil(String jarFileName, boolean isFile) 

this.setJarFileName(jarFileName); 
this.setFile(isFile); 
this.inti(); 

/** 

* *初始化,读取文件信息,并将jar文件路径加入到classpath 

*/ 
private void inti() { 
// 添加jar文件路径到classpath 
if (this.isFile) 

File f = new File(jarFileName); 
addPath(f.toURI().toString()); 
jars.add(f.getAbsolutePath()); 

else 

ReadJarFile df = new ReadJarFile(jarFileName, new String[] { "jar", "zip" }); 
this.jars = df.getJarList(); 
List<String> jarURLs = df.getFilesURL(); 
Object[] obj = jarURLs.toArray(); 
addPath(obj);

/**
  *回叫方法,class操作
  *
  *@paramcallBack
  */
  public void callBack() {
for (String s1:this.jars) {
loadClass(s1);
   }
}
/**
  *添加单个jar路径到classpath
  *
  *@paramjarURL
  */
private void addPath(String jarURL) {
try {
classLoader = new URLClassLoader(new URL[] { new URL(jarURL) });
} catch (MalformedURLException e) {
e.printStackTrace();
}
  }
/**
  *添加jar路径到classpath
  *@paramjarURLs
  */


private void addPath(Object[] jarURLs) {


URL[] urls = new URL[jarURLs.length];
for (int i = 0; i < jarURLs.length; i++) {
try {
System.out.println(jarURLs[i].toString());
urls[i] = new URL(jarURLs[i].toString());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
classLoader = new URLClassLoader(urls);
  }


/**


  *动态载入class
  *
  *@paramjarFileName
  *@paramcallBack
  */
private void loadClass(String jarFileName) {
JarFile jarFile = null;
try {
jarFile = new JarFile(jarFileName);

} catch (IOException e) {

e.printStackTrace();

}


Enumeration<JarEntry> en = jarFile.entries();


while (en.hasMoreElements()) {
JarEntry je = en.nextElement();
String name = je.getName();
String s5 = name.replace('/', '.');
int k=s5.lastIndexOf(".class");
if(k>0){
String className = je.getName().substring(0,je.getName().length() - ".class".length()).replace('/','.');
Class c = null;
try {


c = this.classLoader.loadClass(className);


System.out.println(className);


} catch (ClassNotFoundException e) {


System.out.println("NO CLASS: " + className);


// continue;


} catch (NoClassDefFoundError e) {


System.out.println("NO CLASS: " + className);


// continue;


}
}
}
}


public URLClassLoader getClassLoader() {
return classLoader;
}


public void setClassLoader(URLClassLoader classLoader) {
this.classLoader = classLoader;
}


public String getJarFileName() {
return jarFileName;
}


public void setJarFileName(String jarFileName) {
this.jarFileName = jarFileName;
}


public boolean isFile() {
return isFile;
}


public void setFile(boolean isFile) {
this.isFile = isFile;
}


public List<String> getJars() {
return jars;
}


public void setJars(List<String> jars) {
this.jars = jars;
}

}

3,辅助类

package com;


import java.io.File;
import java.util.ArrayList;
import java.util.List;


public class ReadJarFile {
List<String> jarList = new ArrayList<String>();
List<String> filesURL = new ArrayList<String>();
/**
  * 读取指定文件夹的文件
  *
  * @param jarFileName
  *            路径
  * @param strings
  *            后缀
  */
public ReadJarFile(String jarFileName, String[] strings) {
File f = new File(jarFileName);
File[] fl = f.listFiles();
for (File file : fl) {
for (String str : strings) {
if (file.getName().endsWith(str)) {
jarList.add(file.getName());
String name=file.toURI().toString();
filesURL.add(name);
  }
  }
  }
}
public List<String> getJarList() {
return jarList;
}
public void setJarList(List<String> jarList) {
this.jarList = jarList;
}
public List<String> getFilesURL() {
return filesURL;
}
public void setFilesURL(List<String> filesURL) {
this.filesURL = filesURL;
}


}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值