URLClassLoader使用方法及事例程序

转载地址:

http://www.cnblogs.com/xwdreamer/archive/2011/12/05/2296918.html

 

1.使用概要:

File file = new File(jar文件全路径);
URL url = file.toURL();
URLClassLoader loader = new URLClassLoader(new URL[] { url });
Class tidyClazz = loader.loadClass(所需class的含包名的全名);

 

2、

我们知道,Java利用ClassLoader将类载入内存,并且在同一应用中,可以有很多个ClassLoader,通过委派机制,把装载的任务传递给上级的装载器的,依次类推,直到启动类装载器(没有上级类装载器)。如果启动类装载器能够装载这个类,那么它会首先装载。如果不能,则往下传递。当父类为null时,JVM内置的类(称为:bootstrap class loader)就会充当父类。想想眼下的越来越多用XML文件做配置文件或者是描述符、部署符。其实这些通过XML文档描述的配置信息最终都要变成Java类,基实都是通过ClassLoader来完成的。URLClassLoader是ClassLoader的子类,它用于从指向  JAR 文件和目录的 URL 的搜索路径加载类和资源。也就是说,通过URLClassLoader就可以加载指定jar中的class到内存中。
下面来看一个例子,在该例子中,我们要完成的工作是利用URLClassLoader加载jar并运行其中的类的某个方法。

(1)创建java project:URLClassLoaderTest0,定义一个接口,使所有继承它的类都必须实现action方法,如下:

package uRLClassLoaderTest0;  
 
//定义接口ActionInterface  
public interface ActionInterface {  
    public String action();  
}  

完成后将其打包为testInterface.jar文件。
(2)接下来新建java project:URLClassLoaderTest1,为了编译通过,引入之前打好的testInterface.jar包。并创建TestAction类,使它实现ActionInterface接口。如下:

package uRLClassLoaderTest1;  
  
import uRLClassLoaderTest0.ActionInterface;  
//在项目中导入testInterface.jar这个包,实现接口ActionInterface.jar包名不能为类名  
public class TestAction implements ActionInterface {  
    public String action() {  
        return "this ActionTest class";  
    }  
}  


完成后将其打包为test.jar,放在d盘根目录下。下面要做的就是利用URLClassLoader加载并运行TestAction的action方法,并将返回的值打印在控制台上。
(3)新建java project:URLClassLoaderTest2,引入testInterface.jar包。并创建一可执行类(main方法),在其中加入如下代码:


 

package uRLClassLoaderTest2;  
 
import java.net.*;  
import java.io.*;  
import uRLClassLoaderTest0.ActionInterface;//项目中导入testInterface这个包  
 
public class ClassLoaderTest {  
   public static void main(String args[]) {  
       try {  
            File file = new File("rtest.txt");  
            BufferedReader in = new BufferedReader(new FileReader(file));  
            String s = new String();  
            while ((s = in.readLine()) != null) {  
                //从rtest.txt中读取的url,根据url创建类装载器  
                URL url = new URL(s);  
                s = null;  
                URLClassLoader myClassLoader = new URLClassLoader(  
                        new URL[] { url }, Thread.currentThread().getContextClassLoader());  
                System.out.println(myClassLoader);  
                Class myClass = myClassLoader.loadClass("uRLClassLoaderTest1.TestAction");  
                ActionInterface action = (ActionInterface) myClass.newInstance();  
                String str = action.action();  
                System.out.println(str);  
                  
                //根据url1创建类装载器  
                URL url1 = new URL("file:d:/test.jar");  
                URLClassLoader myClassLoader1 = new URLClassLoader(  
                        new URL[] { url1 }, Thread.currentThread().getContextClassLoader());  
                Class myClass1 = myClassLoader1.loadClass("uRLClassLoaderTest1.TestAction");  
                ActionInterface action1 = (ActionInterface) myClass1.newInstance();  
                String str1 = action1.action();  
                System.out.println(str1);  
                  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
  
}  


 

该代码先在该工程下建立一个文件rtext.txt,用来存储需要加载的jar的路径(路径为:file:d:/Test.jar),实现时,读取一条路径,加载一个

运行结果:

<a target=_blank href="mailto:java.net.URLClassLoader@152b6651">java.net.URLClassLoader@152b6651</a> 
this ActionTest class  
this ActionTest class  

注意点:

前面打包的jar包的名字不能跟类名相同,比如不能起名为TestAction.jar和ActionInterface.jar


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用URLClassLoader加载类或资源,需要按照以下步骤进行操作: 1. 创建一个URL数组,包含要加载的类或资源的URL。可以使用URL类的构造函数或URI类的toURL()方法来创建URL对象。 2. 创建一个URLClassLoader对象,将URL数组作为参数传递给它的构造函数。 3. 使用URLClassLoader的loadClass()方法加载类,或使用getResource()方法获取资源。 以下是一个示例代码,演示如何使用URLClassLoader加载一个外部jar包中的类: ```java import java.net.URL; import java.net.URLClassLoader; public class Main { public static void main(String[] args) throws Exception { // 创建一个URL数组,包含要加载的jar包的URL URL[] urls = new URL[]{new URL("file:/path/to/your/jarfile.jar")}; // 创建一个URLClassLoader对象 URLClassLoader classLoader = new URLClassLoader(urls); // 使用URLClassLoader加载类 Class<?> loadedClass = classLoader.loadClass("com.example.MyClass"); // 创建类的实例并调用方法 Object instance = loadedClass.newInstance(); loadedClass.getMethod("someMethod").invoke(instance); } } ``` 在上述示例中,我们首先创建一个URL数组,其中包含要加载的jar包的URL。然后,我们使用这个URL数组创建了一个URLClassLoader对象。接下来,我们使用loadClass()方法加载了指定名称的类,并通过反射创建了类的实例并调用了其中的方法。 请注意,在实际使用中,你需要将`/path/to/your/jarfile.jar` 替换为你要加载的jar包的实际路径,`com.example.MyClass` 替换为你要加载的类的完整类名,并根据需要调整代码逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值