java动态加载class的几种方法
Posted On 2011年12月29日
有时候我们需要在java里动态load class文件,比如load的文件不在工程内,也没有在classpath的环境变量里(见第四种方法)。 根据网上的资料,归纳一下几种动态加载class的方法。
{ String testlibstring="com.whoistester.lib.TestLib"; String Classroot="c:/TestLib.class"; /** * 1。first method to load class 前提:该class文件在本工程中 */ Object a = Class.forName(testlibstring).newInstance(); // 注意testlibstring包含 包名+类名哦!! Method method = a.getClass().getMethod("hello"); method.invoke(a); /** * 2。second method to load class 前提:该class文件在本工程中 */ ClassLoader loader = ClassLoader.getSystemClassLoader(); System.out.println(loader); Class testlibclass = loader.loadClass(testlibstring); // 注意testlibstring包含 包名+类名哦!! Object newinstance = testlibclass.newInstance(); method = newinstance.getClass().getMethod("hello"); method.invoke(newinstance); /** * * 3。third method to load class and execute method 前提:该class文件在本工程中 * */ ClassLoader loader3 = Test.class.getClassLoader(); System.out.println(loader3); Class testlibclass3 = loader3.loadClass(testlibstring); // 注意testlibstring包含 包名+类名哦!! Object newinstance3 = testlibclass3.newInstance(); method = newinstance3.getClass().getMethod("hello"); method.invoke(newinstance3); /** * * 4。fourth method to load class and execute method 前提:该class文件在任何其他位置,但该方法需要自行定义classloader (这里的自己定义的loader为MyClassLoader) * * **/ ClassLoader loader4 = Test.class.getClassLoader(); MyClassLoader myloader = new MyClassLoader(loader4); Class myownclassloadded = myloader.loadClass("TestLib"); //System.out.println("==========================="); Object newinstance4 = myownclassloadded.newInstance(); Method method4 = newinstance4.getClass().getMethod("hello"); method4.invoke(newinstance4); }
下面是myclassloader的代码:
package com.whoistester; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; public class MyClassLoader extends ClassLoader{ public MyClassLoader(ClassLoader parent) { super(parent); } public Class loadClass(String name) throws ClassNotFoundException { if(!"TestLib".equals(name)) return super.loadClass(name); System.out.println(name); try { String url = "file:D:/research/load generator development/testlib/TestLib.class"; URL myUrl = new URL(url); URLConnection connection = myUrl.openConnection(); InputStream input = connection.getInputStream(); ByteArrayOutputStream buffer = new ByteArrayOutputStream(); int data = input.read(); while(data != -1){ buffer.write(data); data = input.read(); } input.close(); byte[] classData = buffer.toByteArray(); //System.out.println("++++++++++++++++++"+classData.length); return defineClass("TestLib", classData, 0, classData.length); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } }
此篇文章已被阅读3168 次