分享
 
 
 

JVMPI动态加载jar包path入当前classloader

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

java本身建议创建ClassLoader子类,并完成类似addURL方法已达到动态加载类路径。但在第三方包运行时,对方已经实现了ClassLoader子类且未提供此方法。则可以利用JVMPI技术完成这一操作。

java 部分:

<com.myCom.myproj.myclass>

extClassLoader = Thread.currentThread().getContextClassLoader();

File extDir = new File( System.getProperty( "cyanea.home" )+"/lib/ext/" );

File extFiles[] = extDir.listFiles();

ArrayList loaders = null;

if( extFiles != null )

{

for( int i = 0 ; i < extFiles.length ; i ++ )

{

try

{

loaders = addClassPath( extClassLoader, extFiles[i].toURL() );

}catch( Exception e )

{

System.out.println( "exception in addClassPath" );

}

}

C 部分:

#include "classloader.h"

#pragma convlit(resume)

//it is a helper function to get the URL of a loader

//addClassPath will return an arraylist of loader, iterate the arraylist and call this function

//will print out the class loader loading sequence

JNIEXPORT jobject JNICALL Java_com_myCom_myproj_myclass_addClassPath( JNIEnv *env, jobject thisObject, jobject extclassloader, jobject url )

{

jobject loaders = NULL;

try{

if( extclassloader == NULL || url == NULL ) throw 0;

jclass extclassloaderclass = env->GetObjectClass( extclassloader );

//add code to deal with the ClassLoader Implement Class here.

//load

jfieldID ucpid = env->GetFieldID( extclassloaderclass, "ucp", "Lsun/misc/URLClassPath;" );

if( ucpid == NULL ) throw 5;

jobject ucp = env->GetObjectField( extclassloader, ucpid );

if( ucp == NULL ) throw 6;

jclass ucpclass = env->GetObjectClass( ucp );

jfieldID pathid = env->GetFieldID( ucpclass, "path", "Ljava/util/ArrayList;" );

if( pathid == NULL ) throw 7;

jobject path = env->GetObjectField( ucp, pathid );

if( path == NULL ) throw 8;

jclass pathclass = env->GetObjectClass( path );

jmethodID add2path = env->GetMethodID( pathclass, "add", "(ILjava/lang/Object;)V" );

if( add2path == NULL ) throw 9;

env->CallVoidMethod( path, add2path, 0, url );

if( env->ExceptionOccurred() ) throw 10;

jmethodID check = env->GetStaticMethodID( ucpclass, "check", "(Ljava/net/URL;)V" );

if( check == NULL ) throw 11;

env->CallStaticVoidMethod( ucpclass, check, url );

if( env->ExceptionOccurred() ) throw 12;

//create loader and add to loaders and lmap

jfieldID loadersID = env->GetFieldID( ucpclass, "loaders", "Ljava/util/ArrayList;" );

jfieldID lmapID = env->GetFieldID( ucpclass, "lmap", "Ljava/util/HashMap;" );

if( loadersID == NULL || lmapID == NULL ) throw 13;

loaders = env->GetObjectField( ucp, loadersID );

jobject lmap = env->GetObjectField( ucp, lmapID );

if( loaders == NULL || lmap == NULL )

{

throw 14;

}

jfieldID jarHandlerID = env->GetFieldID( ucpclass, "jarHandler", "Ljava/net/URLStreamHandler;" );

if( jarHandlerID == NULL ) throw 15;

jobject jarHandler = env->GetObjectField( ucp, jarHandlerID );

if( jarHandler == NULL ) printf( "jar handler is null" );

jclass jarloaderclass = env->FindClass( "sun/misc/URLClassPath$JarLoader" );

if( jarloaderclass == NULL )

{

throw 16;

}

jmethodID jarloaderconstructor = env->GetMethodID( jarloaderclass, "<init>", "(Ljava/net/URL;Ljava/net/URLStreamHandler;Ljava/util/HashMap;)V" );

if( jarloaderconstructor == NULL ) throw 17;

//create a new instance of JarLoader

jobject jarloader = env->NewObject( jarloaderclass, jarloaderconstructor, url, jarHandler, lmap );

if( jarloader == NULL ) throw 18;

jclass loadersclass = env->GetObjectClass( loaders );

jclass lmapclass = env->GetObjectClass( lmap );

//add jarloader to loaders

jmethodID add2loaders = env->GetMethodID( loadersclass, "add", "(ILjava/lang/Object;)V" );

if( add2loaders == NULL ) throw 19;

env->CallVoidMethod( loaders, add2loaders, 0, jarloader);

if( env->ExceptionOccurred() ) throw 20;

//put (url,jarloader) to lmap

jmethodID put2lmap = env->GetMethodID( lmapclass, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" );

if( put2lmap == NULL ) throw 21;

env->CallObjectMethod( lmap, put2lmap, url, jarloader );

if( env->ExceptionOccurred() ) throw 22;

}catch( int errcode )

{

loaders = NULL;

probelog( ERROR_LOG , "PROBE_DEBUG", "Error" );

}

return loaders;

}

#pragma convlit(suspend)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有