日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java 运行 加载jar,java运行时加载额外的 jar 包或 class

發(fā)布時(shí)間:2023/12/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 运行 加载jar,java运行时加载额外的 jar 包或 class 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先講下java類加載的順序

每個(gè)類加載器有自己的名字空間,對(duì)于同一個(gè)類加載器實(shí)例來(lái)說(shuō),名字相同的類只能存在一個(gè),并且僅加載一次。不管該類有沒(méi)有變化,下次再需要加載時(shí),它只是從自己的緩存中直接返回已經(jīng)加載過(guò)的類引用。

接下來(lái)講如何加載外部jar

首先要有一個(gè)工程外的jar包,這里假定有個(gè)Test.jar,里面有個(gè)com.chentaoqian.test.Test類。

使用系統(tǒng)類加載器,加載一個(gè)jar

Java

package com.chentaoqian.classloaderdemo;

import java.io.File;

import java.lang.reflect.Method;

import java.net.URL;

import java.net.URLClassLoader;

public class MyClassloader {

public static void classLoader(File file, String className, String methodName, Object[] args, Class>[] parameterTypes) {

try {

URL url = file.toURI().toURL();

//得到系統(tǒng)類加載器,利用該加載器加載指定路徑下的jar包

URLClassLoader urlClassLoader= (URLClassLoader) ClassLoader.getSystemClassLoader();

Method add = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{ URL.class});

add.setAccessible(true);

add.invoke(urlClassLoader, new Object[] {url});

urlClassLoader.loadClass(className);

Class> c = urlClassLoader.loadClass(className);

//列出所有方法

// Method[] methods = c.getMethods();

// for (Method m : methods) {

// System.out.println(m.getName());

// }

//調(diào)用方法

// if (args == null) {

// c.getMethod(methodName, parameterTypes).invoke(c.newInstance());

// } else {

// c.getMethod(methodName, parameterTypes).invoke(c.newInstance(), args);

// }

// urlClassLoader.close();

} catch (Exception e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

//無(wú)參方法的例子

classLoader(new File("E:\\TestJar.jar"), "com.chentaoqian.test.Test", "sayHi", null, null);

//有參方法的例子

classLoader(new File("E:\\TestJar.jar"), "com.chentaoqian.test.Test", "sayBye", new String[]{"byebye"}, new Class>[]{String.class});

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

packagecom.chentaoqian.classloaderdemo;

importjava.io.File;

importjava.lang.reflect.Method;

importjava.net.URL;

importjava.net.URLClassLoader;

publicclassMyClassloader{

publicstaticvoidclassLoader(Filefile,StringclassName,StringmethodName,Object[]args,Class>[]parameterTypes){

try{

URLurl=file.toURI().toURL();

//得到系統(tǒng)類加載器,利用該加載器加載指定路徑下的jar包

URLClassLoaderurlClassLoader=(URLClassLoader)ClassLoader.getSystemClassLoader();

Methodadd=URLClassLoader.class.getDeclaredMethod("addURL",newClass[]{URL.class});

add.setAccessible(true);

add.invoke(urlClassLoader,newObject[]{url});

urlClassLoader.loadClass(className);

Class>c=urlClassLoader.loadClass(className);

//列出所有方法

//??????????Method[] methods = c.getMethods();

//??????????for (Method m : methods) {

//??????????????System.out.println(m.getName());

//??????????}

//調(diào)用方法

//??????????if (args == null) {

//??????????????c.getMethod(methodName, parameterTypes).invoke(c.newInstance());

//??????????} else {

//??????????????c.getMethod(methodName, parameterTypes).invoke(c.newInstance(), args);

//??????????}

//??????????urlClassLoader.close();

}catch(Exceptione){

e.printStackTrace();

}

}

publicstaticvoidmain(String[]args){

//無(wú)參方法的例子

classLoader(newFile("E:\\TestJar.jar"),"com.chentaoqian.test.Test","sayHi",null,null);

//有參方法的例子

classLoader(newFile("E:\\TestJar.jar"),"com.chentaoqian.test.Test","sayBye",newString[]{"byebye"},newClass>[]{String.class});

}

}

使用jdk自帶的classloader,可以正確的加載jar包中的指定class,但如果要加載單獨(dú)的一個(gè)class文件,則會(huì)報(bào)錯(cuò)。

使用自定義類加載器,加載一個(gè)class

通過(guò)編寫(xiě)一個(gè)類繼承自ClassLoader,并重寫(xiě)findClass方法

package com.chentaoqian.classloaderdemo;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileInputStream;

public class MyClassloader2 extends ClassLoader {

private String fileName;

public MyClassloader2(String fileName) {

this.fileName = fileName;

}

@Override

protected Class> findClass(String name) throws ClassNotFoundException {

File file = new File(fileName);

try {

FileInputStream fis = new FileInputStream(file);

ByteArrayOutputStream bos = new ByteArrayOutputStream();

int len = 0;

while ((len = fis.read()) != -1) {

bos.write(len);

}

byte[] data = bos.toByteArray();

fis.close();

bos.close();

return defineClass(name, data, 0, data.length);

} catch (Exception ex) {

ex.printStackTrace();

}

return super.findClass(name);

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

packagecom.chentaoqian.classloaderdemo;

importjava.io.ByteArrayOutputStream;

importjava.io.File;

importjava.io.FileInputStream;

publicclassMyClassloader2extendsClassLoader{

privateStringfileName;

publicMyClassloader2(StringfileName){

this.fileName=fileName;

}

@Override

protectedClass>findClass(Stringname)throwsClassNotFoundException{

Filefile=newFile(fileName);

try{

FileInputStreamfis=newFileInputStream(file);

ByteArrayOutputStreambos=newByteArrayOutputStream();

intlen=0;

while((len=fis.read())!=-1){

bos.write(len);

}

byte[]data=bos.toByteArray();

fis.close();

bos.close();

returndefineClass(name,data,0,data.length);

}catch(Exceptionex){

ex.printStackTrace();

}

returnsuper.findClass(name);

}

}

package com.chentaoqian.classloaderdemo;

import java.lang.reflect.Method;

public class ClassloaderTest {

public static void main(String[] args) {

MyClassloader2 myClassloader = new MyClassloader2("E:\\Test.class");

try {

//加載class文件

Class> c = myClassloader.loadClass("com.chentaoqian.test.Test");

if(c != null){

try {

Object obj = c.newInstance();

// Method method = c.getDeclaredMethod("sayHi", null);

Method method = c.getMethod("sayHi", null);

//通過(guò)反射調(diào)用Test類的say方法

method.invoke(obj, null);

} catch (Exception e) {

e.printStackTrace();

}

}

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

packagecom.chentaoqian.classloaderdemo;

importjava.lang.reflect.Method;

publicclassClassloaderTest{

publicstaticvoidmain(String[]args){

MyClassloader2myClassloader=newMyClassloader2("E:\\Test.class");

try{

//加載class文件

Class>c=myClassloader.loadClass("com.chentaoqian.test.Test");

if(c!=null){

try{

Objectobj=c.newInstance();

//????????????????????Method method = c.getDeclaredMethod("sayHi", null);

Methodmethod=c.getMethod("sayHi",null);

//通過(guò)反射調(diào)用Test類的say方法

method.invoke(obj,null);

}catch(Exceptione){

e.printStackTrace();

}

}

}catch(ClassNotFoundExceptione){

e.printStackTrace();

}

}

}

這種方式可以正確加載class文件。需要注意的是:若該class文件使用了extends,則加載會(huì)報(bào)錯(cuò),因?yàn)楦割愓也坏健?/p>

總結(jié)

以上是生活随笔為你收集整理的java 运行 加载jar,java运行时加载额外的 jar 包或 class的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人aaa视频 | 自拍偷拍中文字幕 | 成人午夜在线视频 | 最近的中文字幕在线看视频 | 无码国产精品96久久久久 | 精品国产乱码久久久 | 成人黄色动漫在线观看 | 91久久婷婷 | 中国挤奶哺乳午夜片 | 久久人人妻人人人人妻性色av | 欧美日韩麻豆 | 成年人免费高清视频 | 人人干av | 日韩成人一区二区视频 | 成人在线观看亚洲 | 偷拍老头老太高潮抽搐 | 婷婷色激情 | 天天操天天插天天射 | 91丨porny丨尤物 | 五月婷婷一区二区三区 | 人妖一区 | 国产日视频| 中文字幕在线观看视频一区 | 最好看的电影2019中文字幕 | 亚洲av无码一区二区三区网站 | 黄色一级免费看 | 91亚洲精品久久久蜜桃借种 | 欧美黑人一级爽快片淫片高清 | 色婷婷av一区二区三区麻豆综合 | 夜夜操网 | a激情 | 午夜视频在线免费看 | 亚洲h动漫 | 少妇饥渴难耐 | 一区视频免费观看 | 动漫av一区二区 | 久久精品夜色噜噜亚洲a∨ 中文字幕av网 | 国产51页 | 国产精品亚洲一区二区 | 亚洲卡一卡二卡三 | 亚洲欧美在线观看视频 | 久久99精品国产麻豆婷婷洗澡 | 涩涩视频软件 | 黄色肉肉视频 | 婷婷色综合网 | 69日本xxxxxxxxx30| 天天综合网在线 | 亚洲国产精品suv | 少妇无内裤下蹲露大唇视频 | 午夜精品一区二区三 | 老司机成人在线 | 国产91精 | 国产精品v日韩精品v在线观看 | 永久久久久久久 | 92久久精品一区二区 | 岛国久久久 | 男人日女人免费视频 | 黄色激情视频在线观看 | 手机免费av | 中文av一区 | 日日爱666| 永久免费看成人av的动态图 | 久久久久99精品成人片我成大片 | 国产色自拍 | 波多野结衣中文字幕一区二区 | 日本一区二区三区视频在线观看 | 国产,日韩,欧美 | 农村寡妇一区二区三区 | 久久艹国产精品 | 亚洲成a | 日韩综合中文字幕 | 成人一区二区av | 黄色日韩 | 麻豆精品视频在线 | 在线午夜av | 美女露胸无遮挡 | 欧美粗暴jizz性欧美20 | 一区二区福利电影 | 97超碰国产在线 | 青青草99 | 国产精品久久久精品三级 | 搡8o老女人老妇人老熟 | 欧美人与禽性xxxxx杂性 | 夜噜噜| av免费大片 | 国产精品夜夜夜爽阿娇 | 免费一级欧美片在线播放 | 人人爱超碰 | 日本三级大全 | 国产又猛又黄 | 狠狠艹av | 男人的网址| 亚洲素人在线 | 欧美亚洲综合视频 | 久久精品国产av一区二区三区 | 古代黄色片| 欧美性猛交xxxx乱大交hd | 国产老头户外野战xxxxx | 特级一级黄色片 |