好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java 使用反射调用jar包中的类方式

下面讲展示的是从image.jar包中调用image.Buddy类的方法。

?

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

public class Main {

     public static void main(String[] args) {

         try {

 

//          两种方式都可以

             URL url = new File( "/Users/wuchen/Documents/IntelliJIDEA/Applet/out/production/Applet/image.jar" ).toURI().toURL();

//          URL url = new URL("file:/Users/wuchen/Documents/IntelliJIDEA/Applet/out/production/Applet/image.jar");

             URL[] urls = new URL[]{ url };

             URLClassLoader loader = new URLClassLoader(urls);

             Class c = loader.loadClass( "image.Buddy" );

             Object o = c.newInstance();

             Method m = c.getMethod( "sleep" );

             m.invoke(o);

 

         } catch (NoSuchMethodException e) {

             e.printStackTrace();

         } catch (IllegalAccessException e) {

             e.printStackTrace();

         } catch (InstantiationException e) {

             e.printStackTrace();

         } catch (ClassNotFoundException e) {

             e.printStackTrace();

         } catch (InvocationTargetException e) {

             e.printStackTrace();

         } catch (MalformedURLException e) {

             e.printStackTrace();

         }

     }

}

有几点需要注意

第一:

URL 是 "file:/Users/wuchen/Documents/IntelliJIDEA/Applet/out/production/Applet/image.jar"

image.jar后面没有斜杠了

第二:

类名是 image.Buddy,不要因为URL里面有image就把image.Buddy中的image省略掉。

第三:

Buddy.class应该放在image文件夹内,然后打包image文件夹,而不是打包image文件夹里的所有文件,再把包名改成image.jar

补充:java动态载入指定的类或者jar包反射调用其方法

序言

有时候。项目中会用到java动态载入指定的类或者jar包反射调用其方法来达到模块的分离,使各个功能之间耦合性大大减少,更加的模块化。代码利用率更高。模式中的代理模式就用到java的这一机制。

下边就让我们通过代码来看看怎样实现此功能。

代码具体

?

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

package loadjarclass;

import java.io.File;

import java.lang.reflect.Method;

import java.net.URL;

import java.net.URLClassLoader;

import org.junit.Test;

public class LoadJarClassTest {

 

  @Test

  public void testLoadClass() throws Exception{

   /*动态载入指定类*/

   File file=new File("D:/test");//类路径(包文件上一层)

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

   ClassLoader loader=new URLClassLoader(new URL[]{url});//创建类载入器

   //import com.sun.org.apache.bcel.internal.util.ClassLoader;

   //ClassLoader classLoader = new ClassLoader(new String[]{""});//类路径

   Class<?> cls=loader.loadClass("loadjarclass.TestTest");//载入指定类。注意一定要带上类的包名

   Object obj=cls.newInstance();//初始化一个实例

   Method method=cls.getMethod("printString",String.class,String.class);//方法名和相应的參数类型

   Object o=method.invoke(obj,"chen","leixing");//调用得到的上边的方法method

   System.out.println(String.valueOf(o));//输出"chenleixing"

  

   /*动态载入指定jar包调用当中某个类的方法*/

   file= new File( "D:/test/commons-lang3.jar" ); //jar包的路径

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

   loader= new URLClassLoader( new URL[]{url}); //创建类载入器

   cls=loader.loadClass( "org.apache测试数据mons.lang3.StringUtils" ); //载入指定类,注意一定要带上类的包名

   method=cls.getMethod( "center" ,String. class , int . class ,String. class ); //方法名和相应的各个參数的类型

   o=method.invoke( null , "chen" ,Integer.valueOf( 10 ), "0" ); //调用得到的上边的方法method(静态方法,第一个參数能够为null)

   System.out.println(String.valueOf(o)); //输出"000chen000","chen"字符串两边各加3个"0"字符串

  }

}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。

原文链接:https://blog.csdn.net/sinat_16492463/article/details/44853849

查看更多关于Java 使用反射调用jar包中的类方式的详细内容...

  阅读:13次