`

ClassLoader 与 URLClassLoader 的用法!

    博客分类:
  • J2SE
 
阅读更多

转自: http://blog.csdn.net/suiusoar/article/details/7530191

  1. 读取配置文件中的信息

配置文件的内容:

用URLClassLoader读配置文件内容:

  1. import java.io.IOException;
  2. import java.net.URL;
  3. import java.net.URLClassLoader;
  4. import java.util.Properties;
  5. public class Testext {
  6. public static void main(String[] args) throws IOException {
  7. Properties properties = new Properties();
  8. URL[] urls = new URL[] { new URL("file:/"
  9. + System.getProperty("user.dir") + "/ravageWeb/") };
  10. URLClassLoader ucl = new URLClassLoader(urls);
  11. //ClassLoader cl = Testext.class.getClassLoader(); //这两行也可以不写
  12. //cl = ucl; //如果写,下面就要改为:cl.getResourceAsStream...
  13. properties.load(ucl.getResourceAsStream("resources/testpro.properties"));
  14. System.out.println(properties.getProperty("sui"));
  15. }
  16. }
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Properties;

public class Testext {
	public static void main(String[] args) throws IOException {
		Properties properties = new Properties();
		URL[] urls = new URL[] { new URL("file:/"
				+ System.getProperty("user.dir") + "/ravageWeb/") };
		URLClassLoader ucl = new URLClassLoader(urls);
		//ClassLoader cl = Testext.class.getClassLoader(); 	//这两行也可以不写
		//cl = ucl; 	//如果写,下面就要改为:cl.getResourceAsStream...
		properties.load(ucl.getResourceAsStream("resources/testpro.properties"));
		System.out.println(properties.getProperty("sui"));
	}
}

遇到的问题:1. "/ravageWeb/" 中第二个 / 可写可不写。 但是若改为 "/ravageWeb/resources/" 则resources后必须加 / 否则报NullPointerException

用ClassLoader读配置文件内容:

  1. import java.io.IOException;
  2. import java.util.Properties;
  3. public class Testext {
  4. public static void main(String[] args) throws IOException {
  5. Properties properties = new Properties();
  6. properties.load(Testext.class.getClassLoader()
  7. .getResourceAsStream("resources/testpro.properties"));
  8. System.out.println(properties.getProperty("sui"));
  9. }
  10. }
import java.io.IOException;
import java.util.Properties;

public class Testext {
	public static void main(String[] args) throws IOException {
		Properties properties = new Properties();
		properties.load(Testext.class.getClassLoader()
				.getResourceAsStream("resources/testpro.properties"));
		System.out.println(properties.getProperty("sui"));
	}
}

 

总结:很显然ClassLoader与URLClassLoader的区别是:

ClassLoader只能读位于classpath下的文件(即:resources/testpro.properties必须放到src目录下,编译后进入bin目录);

而URLClassLoader可以读任意目录下的文件!

2. 载入一个类

用ClassLoader载入一个类:

  1. import java.io.IOException;
  2. public class Testext {
  3. public static void main(String[] args) throws IOException,
  4. ClassNotFoundException {
  5. Class c = Testext.class.getClassLoader().loadClass("stalk.STalkClient");
  6. System.out.println(c.getName()); //输出:stalk.STalkClient
  7. }
  8. }
import java.io.IOException;

public class Testext {
	public static void main(String[] args) throws IOException,
			ClassNotFoundException {
		Class c = Testext.class.getClassLoader().loadClass("stalk.STalkClient");
		System.out.println(c.getName());	//输出:stalk.STalkClient
	}
}

 

用URLClassLoader载入一个类:

  1. import java.io.IOException;
  2. import java.net.URL;
  3. import java.net.URLClassLoader;
  4. public class Testext {
  5. public static void main(String[] args) throws IOException,
  6. ClassNotFoundException {
  7. URL[] urls = new URL[] { new URL("file:/"
  8. + System.getProperty("user.dir") + "/ravageWeb/") };
  9. URLClassLoader ucl = new URLClassLoader(urls);
  10. Class c = ucl.loadClass("NoPackage");
  11. System.out.println(c.getName());
  12. }
  13. }
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;

public class Testext {
	public static void main(String[] args) throws IOException,
			ClassNotFoundException {
		
		URL[] urls = new URL[] { new URL("file:/"
				+ System.getProperty("user.dir") + "/ravageWeb/") };
		URLClassLoader ucl = new URLClassLoader(urls);
		Class c = ucl.loadClass("NoPackage");
		System.out.println(c.getName());
	}
}


遇到的问题:"/ravageWeb/" 中第二个 / 必须写,否则报ClassNotFoundException

 

总结:

ClassLoader只能load位于classpath(src目录)下的类;

而URLClassLoader可以load任意目录下的类!

 

 

 

分享到:
评论

相关推荐

    使用URLClassLoader加载本地文件夹c盘下的test.jar文件

    本篇文章将深入讲解如何使用URLClassLoader加载C盘下的test.jar文件。 首先,了解类加载器的基本概念。在Java中,类加载器是负责查找并加载类的机制。Java虚拟机(JVM)使用一系列的类加载器,包括Bootstrap ...

    Java URLClassLoader动态加载jar包1

    需要注意的是,`URLClassLoader`默认只加载指定的URLs,如果需要加载父类加载器的类,可以使用`ClassLoader.getSystemClassLoader()`或者`Thread.currentThread().getContextClassLoader()`。此外,为了安全考虑,...

    lassLoader的关系以及如何防止ClassLoader内存泄漏

    在Java世界中,类加载器(ClassLoader)是关键的组件之一,它负责将类的字节码文件(.class)从文件系统或网络中加载到Java虚拟机(JVM)中,使得程序能够运行。本篇文章将深入探讨ClassLoader的关系网络以及如何...

    URLClassLoader初体验

    `URLClassLoader`还提供了`loadClass()`方法,这个方法是`ClassLoader`的抽象方法实现,用于根据类名加载指定的类。当你调用`loadClass()`时,它会遍历提供的URLs,查找对应的.class文件,并将其转换为Class对象。 ...

    URLClassLoader中指定目录和jar的问题

    理解其工作原理和使用方法,对于解决类加载问题、优化应用性能以及进行定制化开发都至关重要。在实际开发中,我们可能会遇到如何动态添加类路径、处理类加载冲突等问题,这些都是`URLClassLoader`使用中的常见挑战。...

    定义ClassLoader调用外部jar包

    默认情况下,Java使用系统ClassLoader(Bootstrap ClassLoader)加载JDK核心库,然后是Extension ClassLoader加载扩展库,最后是App ClassLoader加载应用类路径(ClassPath)下的类。当这些默认ClassLoader无法满足...

    ClassLoaderTest:测试如何正确关闭类加载器,以便可以关闭基础jar文件上的文件句柄

    创建URLClassLoader后,我们需要确保在不再使用时关闭它,以释放与之关联的资源,尤其是文件句柄。 关闭类加载器的一个常见问题是,当我们动态加载了jar文件中的类后,jar文件会被一个JarFile对象打开,这个对象...

    java classLoader 的全面讲解

    1. 继承ClassLoader:为了实现特定的加载策略,如从网络加载类、从加密数据加载类等,可以继承ClassLoader并重写`findClass()`方法。 2. URLClassLoader:Java提供了一个内置的URLClassLoader,可以直接从指定的URL...

    对Java的ClassLoader的几点认识

    ClassLoader与其他类的不同之处是它是为JVM服务的,属于“公务员”,例如Thread带有getContextClassLoader()和setContextClassLoader()方法;  2、ClassLoader的实现类URLClassLoader完成工作的方法是根据传入的...

    使用自定义ClassLoader解决反序列化serialVesionUID不一致问题 _ 回忆飘如雪1

    此方法能解决所有类的`serialVersionUID`问题,但如果类的属性类型发生变化,仅修改`serialVersionUID`是不够的,因为`serialVersionUID`的变更不仅与类的标识有关,还与类的属性和方法相关。 5. **使用`...

    详解Java动态加载数据库驱动

    `getConnection` 方法接收一个数据源名称,然后根据名称获取相应的数据源信息,如果还没有加载对应驱动,则使用 `URLClassLoader` 加载驱动类,实例化 `Driver` 对象,并将其注册到 `DriverManager` 中。最后,使用...

    URLClass工程之间反射机制的实现

    2. 使用`classLoader`加载类:通过`loadClass(String className)`方法,我们可以加载指定名称的类。 ```java Class<?> loadedClass = classLoader.loadClass("com.example.LibraryClass"); ``` 3. 实例化类:通过`...

    Java面试要点(适用于2年以上经验,1年亦可)

    1. 读取源代码:String、Integer、Long、Enum、BigDecimal、ThreadLocal、ClassLoader & URLClassLoader 2. ArrayList & LinkedList、HashMap & LinkedHashMap & TreeMap & ConcurrentHashMap、HashSet & ...

    AXMLPrinter2、baksmali、smali、dex2jar

    1、用AXMLPrinter2.jar反编译xxx.xml文件 解压xxx.apk,选择main.xml(也可选择其它xml文件,不过xml文件都是乱码),复制到AXMLPrinter2.jar所在目录,通过cmd ...我的处理方法是重新按装JRE较高版本(我原来的是5.0)

    JAVA文件中调用已编译的.CLASS的类.doc

    使用`findClass`方法加载指定类,并通过`newInstance`方法创建其实例。 - 调用`action`方法返回结果。 #### 五、总结 通过上述示例,我们可以了解到如何在Java程序中动态加载并调用已经编译好的`.class`文件中的...

    Java 自动加载JAR文件并运行其中的类方法

    4. **创建对象与调用方法**:加载类后,我们可以创建对象并调用其公共方法。如果`MyClass`有一个无参构造函数,我们可以这样做: ```java Object instance = clazz.newInstance(); Method method = clazz....

    java 动态编译.java文件,动态运行类 _1.1

    这里需要注意,因为新编译的类不在原始的ClassPath中,所以需要自定义ClassLoader,比如使用URLClassLoader。 ```java URL classUrl = new File("path/to/compiled/classes").toURI().toURL(); // 替换为实际的编译...

    IOUtils组件,搭配本文项目专用

    这个组件提供了大量用于输入/输出操作的便捷方法,极大地简化了与输入输出流相关的处理工作。本教程将深入探讨如何利用IOUtils来处理类路径下的资源文件,以及其在实际项目中的应用。 首先,让我们关注`commons-io-...

    java 动态编译.java文件,动态运行类 _1.3

    URLClassLoader classLoader = new URLClassLoader(new URL[]{new File("path/to/compiled/classes").toURI().toURL()}, Thread.currentThread().getContextClassLoader()); Class<?> clazz = Class.forName(...

Global site tag (gtag.js) - Google Analytics