/**
* 加载jar,并得到指定的类
*
* @param jarFileName
* @param classFullName
* @return
* @throws MalformedURLException
*/
private Class loadClass(String jarFileName, String classFullName)
throws MalformedURLException {
//要使用URLClassLoader,因为不是同工程下,同工程下可使用ClassLoader
URLClassLoader classLoader = new URLClassLoader(new URL[] { new URL(
jarFileName) });
JarFile jarFile = null;
Class c = null;
try {
jarFile = new JarFile(jarFileName.substring(5));
} catch (IOException e) {
e.printStackTrace();
}
Enumeration<JarEntry> en = jarFile.entries();
while (en.hasMoreElements()) {
JarEntry je = en.nextElement();
String name = je.getName();
String s5 = name.replace('/', '.');
if (s5.lastIndexOf(".class") > 0) {
String className = je
.getName()
.substring(0, je.getName().length() - ".class".length())
.replace('/', '.');
if (classFullName.equals(className)) {
try {
c = classLoader.loadClass(className);
System.out.println(className);
} catch (ClassNotFoundException e) {
System.out.println("NO CLASS: " + className);
} catch (NoClassDefFoundError e) {
System.out.println("NO CLASS: " + className);
}
break;
}
}
}
return c;
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
Class clazz = this.loadClass("file:C:" + File.separator + "Main.jar",
"com.test.Main");
System.out.println("开始执行!");
// com.test.Main类中的二个方法,为了测试返回值写死,可以得到类中的方法集合
String[] me_name = new String[] { "main", "a" };
for (int i = 0; i < me_name.length; i++) {
try {
Method me = clazz.getMethod(me_name[i],
new Class[] { new String[] {}.getClass() });
// 方法的返回值,可以给方法加参数
Object object = me.invoke(clazz.newInstance(), new Object[] { new String[] { "111111111" } });
System.out.println(object);
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("开始js!");
}
分享到:
相关推荐
总之,使用URLClassLoader加载本地JAR文件是一种灵活的类加载方式,它允许我们动态扩展应用程序的功能,加载自定义的类库。正确理解和运用这个机制,可以极大地提升Java应用程序的可扩展性和灵活性。
- 当`loadClass`方法被调用时,`URLClassLoader`会遍历其URL列表,查找指定类的`.class`文件。 3. **指定目录加载**: - 目录URL(如`file:/path/to/directory/`)用于加载目录下的类文件。类加载器会递归遍历...
这篇博文"定义ClassLoader调用外部jar包"探讨了如何创建一个自定义的ClassLoader,以便能够灵活地加载不在应用主类路径(ClassPath)中的jar包中的类。 首先,我们需要理解ClassLoader的工作原理。默认情况下,Java...
在Java编程中,有时我们需要动态地加载外部JAR文件,并执行其中特定的类方法,这在插件系统、模块化应用或动态扩展性需求中尤为常见。本篇将详细讲解如何实现这一目标。 首先,理解JAR(Java Archive)文件是Java...
总的来说,这段代码展示了如何利用 Java 反射机制在 Tomcat 中动态加载外部 JAR 文件,并执行其中的类和方法。需要注意的是,这种做法通常只适用于开发或测试环境,不推荐在生产环境中频繁使用,因为它可能会影响...
在上面的代码中,我们首先创建了一个URLClassLoader对象,然后使用其loadClass方法来加载外部jar包中的类文件。最后,我们可以使用反射机制来调用加载的类文件中的方法。 使用Java动态添加外部jar包到classpath的...
- 使用`findClass()`方法加载指定的类,并通过`newInstance()`方法创建实例。 4. **动态加载和执行类**: - 在`MyClassLoader`中,`test()`方法演示了如何加载和执行外部类的方法。它接受类路径字符串和类名,...
你需要创建一个`JarFile`对象,指定JAR文件的路径,然后通过调用`getEntries()`方法获取所有条目,或者通过`getEntry(String name)`获取特定条目。 2. **读取JAR内的资源文件**: - `JarInputStream`:如果你知道...
1. **创建ClassLoader**:首先,你需要创建一个新的ClassLoader,通常继承自URLClassLoader,重写findClass()方法,以便从外部JAR文件中加载类。 ```java public class DynamicClassLoader extends URLClassLoader ...
Java反射是Java编程语言中的一个强大特性...在这个"java reflection demo"中,我们学习了如何动态加载外部JAR包,以及如何通过反射来调用类中的方法,这些都是Java开发中的重要技能,特别是在设计可扩展和动态系统时。
学生提问:为什么静态内部类实例方法也不能访问外部类的实例属性呢? 207 学生提问:接口里是否能定义内部接口? 208 6.7.3 使用内部类 208 学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在...
Java动态加载技术是指在Java程序运行过程中,根据需要动态地加载相应的类,创建对象,并执行其方法的过程。这种技术能够让Java程序在运行时根据外部条件决定加载哪些类,从而实现更加灵活和可扩展的程序设计。这种...
- **XML实体验证**:使用安全的解析器,并禁用外部实体引用。 - **数据清理**:对所有外部数据进行适当的清理。 - **最小化XML功能**:避免使用复杂的XML特性。 #### 规则1.4:禁止直接使用不可信数据来记录日志 **...