社区
Java SE
帖子详情
jar 包class动态加载问题 ,请高手指教 !
billwindows
2006-04-06 03:37:01
我已经实现jar包的动态加载,但加载未知的第三方jar包不能清楚,第三方包中哪个是子类,哪个是父类,这样在动态加载时 ,如果先加载子类会报找不到父类异常,请高手指教,您是如何解决这个问题地 *^_^*
...全文
165
3
打赏
收藏
jar 包class动态加载问题 ,请高手指教 !
我已经实现jar包的动态加载,但加载未知的第三方jar包不能清楚,第三方包中哪个是子类,哪个是父类,这样在动态加载时 ,如果先加载子类会报找不到父类异常,请高手指教,您是如何解决这个问题地 *^_^*
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
billwindows
2006-04-06
打赏
举报
回复
心得就是重写ClassLoader,入口直接走该类构造函数即可,里面运行的方法中的 jar 包名和
要加载的类名暂时是写死的
billwindows
2006-04-06
打赏
举报
回复
我书写的实现类如下:
package com.sunrising.common.classloader;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class MyClassLoader extends ClassLoader {
Hashtable loadedClasses;
public MyClassLoader() {
loadedClasses = new Hashtable();
readJarFile("");
createJarClass("");
}
private Hashtable readJarFile(String jarName){
ZipInputStream zistream;
File file = new File("lib"+File.separator+"g.jar");
URL url = null;
try {
url = file.toURL();
} catch (MalformedURLException ex) {
ex.printStackTrace();
}
try
{
zistream = new ZipInputStream(url.openStream());
}
catch(IOException e)
{
return null;
}
try
{
ZipEntry classEntry;
while((classEntry = zistream.getNextEntry()) != null)
{
String className = classEntry.getName().replaceAll("/", ".");
if(className.endsWith(".class"))
{
byte data[] = readClassBytesFromInputStream(zistream);
if(data != null)
{
loadedClasses.put(className, data);
}
}
zistream.closeEntry();
}
zistream.close();
}
catch(IOException e)
{
return null;
}
return loadedClasses;
}
public synchronized void createJarClass(String className){
Hashtable loadedClasses = this.loadedClasses;
Enumeration enum = null;
Class newClass = null;
String name = null;
enum=loadedClasses.keys();
byte []classData =new byte[0];
if(!className.trim().equals("")){
className = className+".class";
classData = classData=(byte[])loadedClasses.get(className);
newClass = defineClass(null, classData, 0, classData.length);
loadedClasses.put(className,newClass);
}
while(enum.hasMoreElements())
{
name=(String)enum.nextElement();
try{
classData=(byte[])loadedClasses.get(name);
newClass = defineClass(null, classData, 0, classData.length);
loadedClasses.put(name,newClass);
}catch(Exception ex){
System.out.println(name+" has been create class");
}
}
}
protected byte[] readClassBytesFromInputStream(InputStream istream)
{
ByteArrayOutputStream baostream = new ByteArrayOutputStream();
BufferedInputStream bistream = new BufferedInputStream(istream);
try
{
byte buffer[] = new byte[1024];
int bytesRead;
while((bytesRead = bistream.read(buffer, 0, 1024)) != -1)
baostream.write(buffer, 0, bytesRead);
buffer = null;
}
catch(IOException e)
{
return null;
}
return baostream.toByteArray();
}
public synchronized Class loadClass(String className, boolean resolve)
throws ClassNotFoundException {
Class newClass = null;
byte[] classData = null;
newClass = (Class) loadedClasses.get(className);
if (newClass != null) {
if (resolve)
resolveClass(newClass);
return newClass;
}
try {
newClass = findSystemClass(className);
return newClass;
} catch (ClassNotFoundException e) {
System.out.println(className + " is not a system class!");
}
try { classData = this.getLocalClassData(className);
newClass = defineClass(null, classData, 0, classData.length);
if (newClass == null)
throw new ClassNotFoundException(className);
} catch (Exception e) {
this.createJarClass(className);
}
loadedClasses.put(className, newClass);
if (resolve) {
resolveClass(newClass);
}
return newClass;
}
protected byte[] getClassData(String className) throws IOException {
byte[] data;
int length;
try {
URL url = new URL(className.endsWith(".class") ? className
: className + ".class");
URLConnection connection = url.openConnection();
InputStream inputStream = connection.getInputStream();
length = connection.getContentLength();
data = new byte[length];
inputStream.read(data);
inputStream.close();
return data;
} catch (Exception e) {
throw new IOException(className);
}
}
protected byte[] getLocalClassData(String className)throws IOException {
byte[] data;
int length;
try {
File file = new File("lib"+File.separator+className);
URL url = file.toURL();
URLConnection connection = url.openConnection();
InputStream inputStream = connection.getInputStream();
length = connection.getContentLength();
data = new byte[length];
inputStream.read(data);
inputStream.close();
return data;
} catch (Exception e) {
throw new IOException(className);
}
}
}
treeroot
2006-04-06
打赏
举报
回复
你如何实现的?
大数据java操作hive.pdf
⼤数据java操作hive ⼤数据 ⼤数据 java操作 操作hive 版权声明: 本⽂为博主学习整理原创⽂章,如有不正之处
请
多多
指教
。 未经博主允许不得转载。 虚拟机上操作,保证 虚拟机上操作,保证hive数据库能正常连接进⼊...
关于在jni层调用
jar
包
的 方法
如有错误,
请
多多
指教
.. 2.本文调用的
包
是 第三方
jar
包
. ArcSoft 没错,是虹软 (人脸识别相关的)... 尽管在java层有相关代码提供,但是出于某些目的,不方便直接调用... 如果有侵权之处,
请
谅解,并联系我...
Maven项目
Jar
包
依赖管理工具
课程简介: 本课程是菩提老师的《Java零基础到高薪架构师》系列课中的课程。也支持单独学习,能够帮助同学们快速的掌握重点核心的知识技术,具有颇高的实际工作价值,快速达标企业级开发要求,课程内容结合实战开发...
通过
Class
Loader
动态
加载
class
文件
1.
Class
Loader与...在Java中提供了3种
Class
Loader分别用于
加载
不同的
Jar
包
。
class
path:简单来说,
class
path就是每个
Class
Loader
加载
class
文件时,寻找
class
的地方。比如Java中提供的3种
Class
Loader其都有...
java怎么打
包
有引用的java文件_在Eclipse中打
包
引用了第三方
jar
包
的J2SE项目成
jar
文件的方法...
最近有个项目有些定时任务...我的方法是创建Java项目,使用JDBC连接数据库进行数据处理,然后打
包
成
jar
文件,通过系统调用运行,这样独立运行避免对应web应用造成影响。其实之前也接触过Kettle这种etl工具,这应该是...
Java SE
62,614
社区成员
307,326
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章