`
ted0928
  • 浏览: 8056 次
  • 性别: Icon_minigender_1
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

如何为RunTime动态添加自定义classpath

阅读更多
这几天在做一个小项目的时候 有这样一个需求, 程序需要动态引入一个.class文件,然后用Class.forName(name)将其载入,从而得到.class文件的信息.如果是在系统当前指定的classpath下,可以直接载入,但是若是自定义的路径下的.class文件,就会报找不到类文件的错.后来我问了老师,老师提供的方法是用ClassLoader.defineClass(byte[] b, int off, int len)来载入.class文件,这种方法已经成功.但我在想,怎么能将这个文件的路径加入classpath中呢,开始我想到了System.setProperty(String key, String value)这个方法,但后来证明是错的,这种方式是对classpath不起作用的,因为系统的类加载器在启动期间很早的时候就读取classpath了,系统在后来是不再读取classpath的,所以修改对系统没有任何作用.这几天在google看到一篇文章,这位国外的仁兄用了一种方法,可以实现动态添加自定义classpath,很好的程序,转载来学习一下.


import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;                   

import java.io.File;
import java.io.IOException;

import java.net.URL;
import java.net.URLClassLoader;

/**
 * Allows programs to modify the classpath during runtime.              
 */                                                                     
public class ClassPathUpdater {                                         
  /** Used to find the method signature. */                             
  private static final Class[] PARAMETERS = new Class[]{ URL.class };   

  /** Class containing the private addURL method. */
  private static final Class> CLASS_LOADER = URLClassLoader.class;

  /**
   * Adds a new path to the classloader. If the given string points to a file,
   * then that file's parent file (i.e., directory) is used as the
   * directory to add to the classpath. If the given string represents a
   * directory, then the directory is directly added to the classpath.
   *
   * @param s The directory to add to the classpath (or a file, which
   * will relegate to its directory).
   */
  public static void add( String s )
    throws IOException, NoSuchMethodException, IllegalAccessException,
           InvocationTargetException {
    add( new File( s ) ); :evil: 
  }

  /**
   * Adds a new path to the classloader. If the given file object is
   * a file, then its parent file (i.e., directory) is used as the directory
   * to add to the classpath. If the given string represents a directory,
   * then the directory it represents is added.
   *
   * @param f The directory (or enclosing directory if a file) to add to the
   * classpath.
   */
  public static void add( File f )
    throws IOException, NoSuchMethodException, IllegalAccessException,
           InvocationTargetException {
    f = f.isDirectory() ? f : f.getParentFile();
    add( f.toURI().toURL() );
  }

  /**
   * Adds a new path to the classloader. The class must point to a directory,
   * not a file.
   *
   * @param url The path to include when searching the classpath.
   */
  public static void add( URL url )
    throws IOException, NoSuchMethodException, IllegalAccessException,
           InvocationTargetException {
    Method method = CLASS_LOADER.getDeclaredMethod("addURL", PARAMETERS );
    method.setAccessible( true );
    method.invoke( getClassLoader(), new Object[]{ url } );
  }

  private static URLClassLoader getClassLoader() {
    return (URLClassLoader)ClassLoader.getSystemClassLoader();
  }
}
 


Example Usage

The following example will add /home/user/dev/java/app/build/com/package to the classpath at runtime:

try {
  ClassPathUpdater.add(/home/user/dev/java/app/build/com/package/Filename.class);
}
catch( Exception e ) {
  e.printStackTrace();
}
分享到:
评论

相关推荐

    antlr-runtime-3.0.jar.zip

    在Java项目中,如果你需要使用ANTLR的运行时库,通常会将`antlr-runtime-3.0.jar` 添加到项目的类路径(classpath)中,或者通过Maven、Gradle等构建工具管理依赖,确保在编译和运行时能够正确地找到和加载ANTLR的...

    Java环境变量添加工具

    Java环境变量添加工具是一款专为Java开发者设计的实用程序,它简化了在Windows操作系统中配置Java开发环境的过程。通常,为了运行Java程序或进行Java开发,我们需要手动设置一系列环境变量,如JAVA_HOME、PATH和...

    java编译环境

    3. **Classpath**:这是一个环境变量,用于指示Java虚拟机或javac编译器到哪里寻找用户自定义的类和包。classpath对于正确编译和运行Java程序至关重要。 4. **System Path**:系统路径是操作系统用来查找可执行文件...

    Java基础知识点总结

    1. 永久配置方式:设置JAVA_HOME环境变量,指向JDK的安装路径,然后将%JAVA_HOME%\bin目录添加到Path环境变量中。 2. 临时配置方式:使用set命令设置Path环境变量,例如set path=%path%;C:\Program Files\Java\jdk\...

    1--实验1.doc

    - 在“系统变量”部分,新建一个变量名为`CLASSPATH`,在“变量值”中输入所需路径。例如,如果源代码分别存放在`d:\ch1`至`d:\ch4`及第三方类库`e:\factory`,则变量值可设为`.;d:\ch1;d:\ch2;d:\ch3;d:\ch4;e:\...

    java新手上路

    - 可通过修改`~/.bashrc`或`/etc/environment`文件来永久性地设置这些环境变量,具体操作为添加或修改`export PATH`和`export CLASSPATH`语句。 5. **修改Path与Classpath的步骤**: - 在Windows系统中,可通过...

    JAVA基础知识的汇总

    类似于C/C++中的`INCLUDE`路径,`CLASSPATH`告诉Java编译器在哪里可以找到用户自定义的类或库。默认情况下,它会检查当前目录(`.`),如果需要引入其他包,需要将其路径添加到`CLASSPATH`中。 5. `PATH`环境变量...

    java 环境变量设置大全

    若需要引用自定义的类库,可以将它们的路径添加到CLASSPATH中。不过,在Java 9及更高版本中,推荐使用模块系统来管理依赖,CLASSPATH的使用逐渐减少,但仍有一些场景需要设置。 设置环境变量的方法因操作系统而异:...

    rcp开发笔记

    例如,加入`org.eclipse.update.configurator`和`org.eclipse.core.runtime`等关键包,有助于识别新添加的插件。 6. **视图和透视图的管理**:在RCP中,视图(View)和透视图(Perspective)是用户界面的重要组成...

    tomcat5.0+lomboz的安装方法

    - Classpath Variable 设置为 `${classPathVariableName}/bin/bootstrap.jar`、`${classPathVariableName}/common/servlet.jar` 和 `${classPathVariableName}/common/jasper-runtime.jar`。 - Project Classpath ...

    java基础笔记

    Java开发的核心工具是JDK(Java Development Kit),它包含了开发和运行Java程序所需的所有工具,包括JRE(Java Runtime Environment)。JRE是运行Java程序的基础,它包括了必要的类库和JVM(Java Virtual Machine)...

    windows操作系统的java环境变量配置.docx

    首先,我们需要安装Java Development Kit (JDK) 和 Java Runtime Environment (JRE)。这两个组件通常可以从Oracle官网下载。在安装时,可以选择自定义安装路径,例如在这个例子中,JDK被安装在`G:/0.1.develop-tools...

    java杂谈

    Classpath的作用是指示Java虚拟机在哪里查找用户自定义的类文件和第三方库。然而,更深层次的理解应涉及Java的类加载机制,即ClassLoader的概念。 Java中的类加载是由不同级别的ClassLoader完成的,主要包括...

    Java基础知识精华部分(个人总结)1

    - **永久配置**:例如,设置`JAVA_HOME`为`%安装路径%\Java\jdk`,并在`PATH`中添加`%JAVA_HOME%\bin`。 - **临时配置**:使用`set path=%path%;C:\Program Files\Java\jdk\bin`命令临时设置。 - **CLASSPATH**:...

    Java&Tomcat;&Eclipse;安装及配置教程

    - **CLASSPATH**: 同样在“系统变量”区域点击“新建”,添加名为`CLASSPATH`的系统变量,其值为`.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar`。注意所有符号都应使用英文状态。 - **Path**: 在已有的`Path`系统...

    毕向东java基础

    - 永久配置:设置`JAVA_HOME`为JDK的安装路径,并将`%JAVA_HOME%\bin`添加到`path`变量中。 - 临时配置:通过命令行使用`set path=%path%;C:\Program Files\Java\jdk\bin`来进行临时配置。 #### 三、Classpath...

    win7正确配置java开发环境[整理].pdf

    3. 创建CLASSPATH变量,值设定为`.;%JAVA_HOME%\lib\dt.jar;.;%JAVA_HOME%\lib\tools.jar`,这使得系统能找到Java运行时需要的库文件。 接下来,验证Java是否安装成功。打开命令提示符(cmd),输入`java -version`...

Global site tag (gtag.js) - Google Analytics