ITPub博客

首页 > 大数据 > Hadoop > Java 从Jar文件中动态加载类

Java 从Jar文件中动态加载类

Hadoop 作者:zengfan2222 时间:2013-12-02 16:32:00 0 删除 编辑

    由于开发需要(为界面提供扩展外观),最近研究了一下从运行Jar中代码的实现。发现Java中的ClassLoader搭配上反射功能就能实现,基本思路如下:

  1. 编写一个接口,让编写的外部需要运行的类(要放到Jar中的)实现这个接口。

  2. 通过ClassLoader加载那个Jar文件,得到一个Class。然后newInstance()创建一个对象

  3. 然后按照接口中的方法去调用指定函数

代码例子:

制作一个Java的记事本程序(NotePad)

然后会从Style.jar中加载程序所需要的样式

其中Style.jar中有一个MyStyle的类实现了一个StyleInterface的接口

接口代码如下:

public interface StyleInterface {

    public String getStyle();

}

MyStyle类的代码如下:

public class MyStyle implements StyleInterface{

    @Override

    public String getStyle() {

        return "我是从MyStyle中得到的样式代码!";

    }

}

然后,在记事本主程序程序中通过如下方式调用:

    String class_path = "MyStyle";//Jar中的所需要加载的类的类名

    String jar_path = "file://D:Style.jar";//jar所在的文件的URL

    try {

        ClassLoader cl = new URLClassLoader(new URL[]{new URL(jar_path)});//从Jar文件得到一个Class加载器

        Class c = cl.loadClass(class_path);//从加载器中加载Class

        StyleInterface sif = (StyleInterface) c.newInstance();//从Class中实例出一个对象

        System.out.println(sif.getStyle());//调用Jar中的类方法

    } catch (MalformedURLException e) {

        e.printStackTrace();

    } catch (ClassNotFoundException e) {

        e.printStackTrace();

    } catch (InstantiationException e) {

        e.printStackTrace();

    } catch (IllegalAccessException e) {

        e.printStackTrace();

    }

注意:

  • class_path必须是完整类名(连同所在的包的路径),例如:在myjava.test下有一个类Test,则Test的完整类名是:myjava.test.Test.而如果是在"缺省包"下的类,就可以省略包的路径(本来就没有)。

  • jar_path不是Jar文件的路径,而是Jar文件的URL。

    通常可以这样表示:"file://Jar文件的绝对路径"

  • 从Class中实例出对象时,一定要把Object强制转换成实现指定接口的类,就想例子中的StyleInterface

编译运行例子代码后就可以发现,控制台就会显示出来自Jar文件中的MyStyle类中getStyle()方法返回的字符串了:

P.S.

由于本人也不是什么高手大神,只是一名Java开发学习者,所以其中有什么不到之处,请大家多多谅解,批评指出,一起交流讨论

                                                                    VoyageLiu

                                                                    2013.12.1

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21988974/viewspace-1111219/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-06-27