java 动态load class 的方法之一
By:Roy.LiuLast updated:2014-11-14
动态加载类是在运行时在有需要的时候再加载这个类,这在大型系统中是很重要的一个机制,也就是采用lazy模式,在有需要的时候才加载,而不是在application server 一启动的时候就加载了很多类。
当然,动态加载类的技术,最主要的也就是应用java的反射机制(java refection来实现), 另外,很多系统采用插件方式开发,部署,在这样的情况下,动态加载类就显得更重要。目前根据开发过的项目经验,基本可以总结为三总类型:
1、加载一个普通的类
2、从网络上加载另外一个类
3、从其他jar包里面加载一个类.
在搞清楚这些之前,需要了解java classloader 的基本原理: class loader 首先检查在内存中是否存在这个类,也就是检查这个类是否已经被加载,如果没有加载,就会在parent class loader 里面去找。如果还找不到就会尝试着直接load这个类.
一下几个方法实现了一个简单的动态加载。自己扩展了一个简单的class loader
另外再实现一个需要被动态加载的类
测试动态加载类
这样就能实现最基本的动态加载类,当然还有其他的方式,在后面继续测试从网络上加载一个类,还有从jar包里面加载需要的类.
当然,动态加载类的技术,最主要的也就是应用java的反射机制(java refection来实现), 另外,很多系统采用插件方式开发,部署,在这样的情况下,动态加载类就显得更重要。目前根据开发过的项目经验,基本可以总结为三总类型:
1、加载一个普通的类
2、从网络上加载另外一个类
3、从其他jar包里面加载一个类.
在搞清楚这些之前,需要了解java classloader 的基本原理: class loader 首先检查在内存中是否存在这个类,也就是检查这个类是否已经被加载,如果没有加载,就会在parent class loader 里面去找。如果还找不到就会尝试着直接load这个类.
一下几个方法实现了一个简单的动态加载。自己扩展了一个简单的class loader
package com.yihaomen.loadclass; import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class JavaClassLoader extends ClassLoader { public void invokeClassMethod(String classBinName, String methodName){ try { // Create a new JavaClassLoader ClassLoader classLoader = this.getClass().getClassLoader(); // Load the target class using its binary name Class> loadedMyClass = classLoader.loadClass(classBinName); System.out.println("Loaded class name: " + loadedMyClass.getName()); // Create a new instance from the loaded class Constructor> constructor = loadedMyClass.getConstructor(); Object myClassObject = constructor.newInstance(); // Getting the target method from the loaded class and invoke it using its name Method method = loadedMyClass.getMethod(methodName); System.out.println("Invoked method name: " + method.getName()); method.invoke(myClassObject); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
另外再实现一个需要被动态加载的类
package com.yihaomen.loadclass; public class MyClass { public void sayHello() { System.out.println("Hello world from the loaded class !!!"); } }
测试动态加载类
package com.yihaomen.loadclass; public class ClassLoaderTest extends JavaClassLoader { public static void main(String[] args) { JavaClassLoader javaClassLoader = new JavaClassLoader(); javaClassLoader.invokeClassMethod("com.yihaomen.loadclass.MyClass", "sayHello"); } }
这样就能实现最基本的动态加载类,当然还有其他的方式,在后面继续测试从网络上加载一个类,还有从jar包里面加载需要的类.
From:一号门
Previous:org.apache.commons.io.FileUtils例子
COMMENTS