关于动态加载jar问题。 我是如下实现过程:1通过System.setProperty("java.class.path","xxxx");将一个从配置文件中读到的路径,设置到当前系统的classpath中。2通过Class.forName("xxx.xxx").newInstance();来得到这个类。 可此处会报ClassNotFoundException,说明1没有设置上,可1设置完,我重新读了环境变量,确实变了。不知道问题出在哪。能人指导下,是不是思路有问题。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我试过了,完全没有问题啊。package com.reg;public class Test3 { private String name = "dduan"; public static void main(String[] args) throws Exception { System.setProperty("java.class.path", "com.reg.Test3"); System.out.println(System.getProperty("java.class.path")); Test3 t = (Test3) Class.forName("com.reg.Test3").newInstance(); System.out.println(t.name); }}输出:com.reg.Test3dduan楼主System.setProperty("java.class.path","xxxx");改成System.setProperty("java.class.path","xxx.xxx");试试 要保证:System.setProperty("java.class.path","xxxx");和Class.forName("xxx.xxx").newInstance();里面的xxx.xxx是一样的。就像我测试的时候都是com.reg.Test3.给出类的全路径,包括包名。 那如果比如是D:\test\下的所有.class文件或.jar文件,该如何做。先谢谢LS的朋友。 一般动态加载类都是直接用Class.forName()这个方法,但这个方法只能创建程序中已经引用的类,并且只能用包名的方法进行索引,比如 Java.lang.String,不能对一个.class文件或者一个不在程序引用里的.jar包中的类进行创建。但使用URLClassLoader 就可以直接根据创建一个单独的.class文件,并且每当重新载入后并实例化后都是最新的方法。类似于jsp,当你在eclipse中改了一个jsp并且存储后,只要刷新页面就可以得到最新的结果而不用重新启动服务器。 URLClassLoader是在java.net包下的一个类。他的构造函数输入参数需要输入1个URL数组。File xFile = new File("c:\\temp\\test.jar"); URL xUrl = xFile.toURL(); URLClassLoader ClassLoader = new URLClassLoader(new URL[] {xUrl }); Class xClass = ClassLoader.loadClass("com.reg.Test3"); Object xObject = xClass.newInstance(); Field field = xClass.getDeclaredField("name"); System.out.println(field); 网上发现了大致是;loader = URLClassLoader(new URL()[]{"D:\test.jar"});loader.loadClass("xxx.xxx"); File xFile = new File("c:\\temp\\test.jar"); URL xUrl = xFile.toURI().toURL(); URLClassLoader ClassLoader = new URLClassLoader(new URL[] {xUrl }); Class xClass = ClassLoader.loadClass("com.reg.Test3"); Object xObject = xClass.newInstance(); Field field = xClass.getDeclaredField("name"); field.setAccessible(true); System.out.println(field.get(xObject));具体关于反射,建议看看书。 呵呵,没仔细写,只知道这原理就行。正在读tomcat的源码,里面有相关操作。 知道问题所在,不知为什么,请问怎么改? 今天ITAT复赛题目 希望高手帮我解答下(注释里的问题) 请问RetroGuard最新的版本是多少?哪里有下载的? 用Vector初始化JTable的问题! 关于异常概念的一个小疑惑 Java与C#的对比,欢迎大家各抒己见 jbuilder如何进行运行配置? 一个另我郁闷以久的问题,还请各位高手多多指教!先谢过各位了! 何为object?望指点! 如何去掉javawebstart启动程序时的安全告警 急急急!windows访问Linux服务器的时候,返回的报文少了数据。
private String name = "dduan"; public static void main(String[] args) throws Exception {
System.setProperty("java.class.path", "com.reg.Test3");
System.out.println(System.getProperty("java.class.path"));
Test3 t = (Test3) Class.forName("com.reg.Test3").newInstance();
System.out.println(t.name);
}
}输出:
com.reg.Test3
dduan楼主System.setProperty("java.class.path","xxxx");改成System.setProperty("java.class.path","xxx.xxx");试试
System.setProperty("java.class.path","xxxx");
和
Class.forName("xxx.xxx").newInstance();
里面的xxx.xxx是一样的。就像我测试的时候都是com.reg.Test3.给出类的全路径,包括包名。
URLClassLoader是在java.net包下的一个类。他的构造函数输入参数需要输入1个URL数组。File xFile = new File("c:\\temp\\test.jar");
URL xUrl = xFile.toURL();
URLClassLoader ClassLoader = new URLClassLoader(new URL[] {xUrl });
Class xClass = ClassLoader.loadClass("com.reg.Test3");
Object xObject = xClass.newInstance();
Field field = xClass.getDeclaredField("name");
System.out.println(field);
大致是;
loader = URLClassLoader(new URL()[]{"D:\test.jar"});
loader.loadClass("xxx.xxx");
File xFile = new File("c:\\temp\\test.jar");
URL xUrl = xFile.toURI().toURL();
URLClassLoader ClassLoader = new URLClassLoader(new URL[] {xUrl });
Class xClass = ClassLoader.loadClass("com.reg.Test3");
Object xObject = xClass.newInstance();
Field field = xClass.getDeclaredField("name");
field.setAccessible(true);
System.out.println(field.get(xObject));具体关于反射,建议看看书。
正在读tomcat的源码,里面有相关操作。