`
shihuan830619
  • 浏览: 583787 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

URLClassLoader初体验

阅读更多
使用概要:
​File file = new File(jar文件全路径); 
​URL url = file.toURL(); 
​URLClassLoader loader = new URLClassLoader(new URL[] { url });
​Class tidyClazz = loader.loadClass(所需class的含包名的全名);

笔者案例:



示例代码:

log4j.properties文件代码如下:
log4j.rootLogger=debug,appender1
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout


JarLoadUtil.java文件代码如下:
package com.shihuan.urlclassloader;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

import org.apache.commons.lang.SystemUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class JarLoadUtil {

	private static Logger logger = LoggerFactory.getLogger(JarLoadUtil.class);  
    private static URLClassLoader loader = null;
    
    /* 
     * 加载lib目录下所有jar文件,并返回相应的的URLClassLoader 
     */  
	public static URLClassLoader getURLClassLoader() {
		if (loader == null) {
			String fileNames[] = listFileNames();
			if (fileNames != null && fileNames.length > 0) {
				URL urls[] = new URL[fileNames.length];
				for (int i = 0; i < fileNames.length; i++) {
					try {
						StringBuilder sb = new StringBuilder();
						sb.append("file:").append(SystemUtils.FILE_SEPARATOR).append(System.getProperty("user.dir")).append(SystemUtils.FILE_SEPARATOR).append("lib");
						urls[i] = new URL(sb.toString() + SystemUtils.FILE_SEPARATOR + fileNames[i]);
					} catch (MalformedURLException e) {
						logger.error("加载lib目录下jar文件出错!", e);
						throw new RuntimeException("加载lib目录下jar文件出错!", e);
					}
				}
				loader = new URLClassLoader(urls);
			}
		}
		return loader;
	}  
	
    /* 
     * 查询lib目录下的所有文件名称 
     */  
	private static String[] listFileNames() {
		File file_directory = new File("lib");
		return file_directory.list();
	}  
	
}


TestUrlClassLoader.java文件代码如下:
package com.shihuan.test;

import java.net.URLClassLoader;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import org.logicalcobwebs.proxool.ProxoolDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.shihuan.urlclassloader.JarLoadUtil;

public class TestUrlClassLoader {

	private static Logger logger = LoggerFactory.getLogger(TestUrlClassLoader.class);
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		URLClassLoader loader = JarLoadUtil.getURLClassLoader(); 
		
		ProxoolDataSource ds = new ProxoolDataSource();
		ds.setDriver("com.mysql.jdbc.Driver");
		ds.setDriverUrl("jdbc:mysql://localhost:3306/myword");
		ds.setUser("root");
		ds.setPassword("12345678");
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		Class<?> clazz = null;
		try {
			clazz = loader.loadClass(ds.getDriver());
			Driver driver = (Driver)clazz.newInstance();          
            
			Properties p = new Properties();  
			p.put("user", ds.getUser());  
			p.put("password", ds.getPassword());       
			              
			conn = driver.connect(ds.getDriverUrl(), p);
			
			logger.info(conn.toString());
			
			String sql = "select id,name from mytaba";
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			while (rs.next()) {
				System.out.println(rs.getInt("id") + "  --  " + rs.getString("name"));
			}
			
			rs.close();
			pstmt.close();
			conn.close();
			
		} catch (ClassNotFoundException e) {
			logger.error(e.getMessage(), e);
		} catch (InstantiationException e) {
			logger.error(e.getMessage(), e);
		} catch (IllegalAccessException e) {
			logger.error(e.getMessage(), e);
		} catch (SQLException e) {
			logger.error(e.getMessage(), e);
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (pstmt != null) {
					pstmt.close();
				}
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		} 
		
	}

}


运行TestUrlClassLoader.java文件中的main方法即可。



或者在dos窗口执行ant命令后进入%PROJECT_HOME%/dist/jar目录,执行java -jar myapp-${日期}.jar
  • 大小: 17 KB
分享到:
评论

相关推荐

    Java URLClassLoader动态加载jar包1

    Java URLClassLoader 是Java标准库中的一个类加载器,它允许我们动态地从指定的URL位置加载类和资源。这个功能在开发插件系统、热部署或者处理多种版本库的场景中非常有用。从JDK 1.2开始,`java.net.URLClassLoader...

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

    URLClassLoader是Java提供的一种类加载器,它允许我们通过URL来加载类和资源,从而实现这一目标。本篇文章将深入讲解如何使用URLClassLoader加载C盘下的test.jar文件。 首先,了解类加载器的基本概念。在Java中,类...

    URLClassLoader中指定目录和jar的问题

    在Java编程语言中,`URLClassLoader`是Java标准类加载器的一种实现,它负责从指定的URL(统一资源定位符)加载类和资源。本文将深入探讨`URLClassLoader`的工作原理,以及如何处理指定目录和JAR文件中的类加载问题。...

    java反序列化漏洞URLClassLoader利用1

    这里提到的“Java反序列化漏洞URLClassLoader利用1”是利用了Java中的`java.net.URLClassLoader`来远程加载并执行恶意代码的一个示例。 `URLClassLoader`是Java中的一个类加载器,它可以从指定的URL列表中加载类。...

    Springboot + Hutool-db 使用 URLClassLoader 动态加载外部数据库和数据池 jar包实例

    在这个场景中,我们看到一个基于Springboot的应用程序结合了Hutool-db库,利用URLClassLoader来实现动态加载外部数据库驱动和数据池的jar包。这使得开发者可以在不重启应用的情况下更新或添加新的数据库连接和资源池...

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

    当我们使用自定义的URLClassLoader时,尤其需要注意类加载器的生命周期管理,因为不正确的关闭可能导致打开的文件句柄无法正确释放,从而消耗系统资源。 首先,我们来了解下类加载器的工作原理。Java中的类加载器...

    华为编程规范和范例提供一个规范代码的参考

    华为编程规范和范例是为开发者提供的一套指导原则,旨在提升代码质量、增强可读性和维护性。遵循这样的规范,可以确保团队间的代码一致性,提高软件开发的效率,并降低后期维护的成本。以下是对这份规范的详细解读:...

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

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

    aop面向切面需要的jar包

    at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang....

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

    `URLClassLoader`是Java中的一个关键类,它是`ClassLoader`的一个子类,主要用于加载来自特定URL位置的类。在"URLClass工程之间反射机制的实现"这个主题中,我们将深入探讨如何利用这两个概念在不同的工程之间实现...

    C_C_和Java安全编码实践提示与技巧,C_C_和Java安全编码实践提示与技巧

    ### C/C++与Java安全编码实践提示与技巧 在当今高度数字化的世界中,软件安全已成为开发者面临的关键挑战之一。无论是大型企业应用还是嵌入式系统,确保代码的安全性都至关重要。本文将深入探讨C/C++及Java编程语言...

    swing-worker-1.1.jar

    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(NativeMethod) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at sun.misc....

    java动态加载插件化编程详解

    3. URLClassLoader:URLClassLoader是一个Java类加载器,它可以根据URL加载类或 jar 文件。在插件化编程中,URLClassLoader可以用于加载插件。 4. 插件管理:插件管理是指对插件的生命周期管理,包括插件的加载、...

    加载jar包中的spring配置文件

    在Java开发中,Spring框架是应用最广泛的IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)框架之一。当我们构建一个基于Spring的应用时,经常需要从jar包中加载配置文件,...

    android反编译dex2jar

    at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang....

    解决classloader的jar包

    包括commons-logging commons-beanutils commons-lang ezmorph json-lib-2.4-jdk15 commons-collections-3.2.1的jar包,可以解决 org/apache/commons/lang/exception/NestableRuntimeException的问题

    java 反射运行时加载外部jar到Tomcat StandardClassLoader1

    URLClassLoader c = (URLClassLoader) getClass().getClassLoader().getParent().getParent(); ``` 2. 创建一个 `URL` 对象,表示要加载的 JAR 文件的 URL。 ```java URL jar = new URL(...

    AXMLPrinter2、baksmali、smali、dex2jar

    at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$100(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController....

    RMI不依赖其他http服务实现代码动态下载

    这个改进的核心在于Java 6中的`java.net.URLClassLoader`和`sun.rmi.server.LoaderHandler`类。`URLClassLoader`能够从URL加载类,而`LoaderHandler`则负责处理RMI中的类加载逻辑。通过这两者的结合,RMI可以在需要...

Global site tag (gtag.js) - Google Analytics