11
来源:互联网 发布:匡恩网络什么背景 编辑:程序博客网 时间:2024/05/16 18:41
package com.ailk;import java.lang.reflect.*;import java.util.ArrayList;import java.util.List;import com.ailk.dynamic.Demo;public class DemoMain { static public void main( String args[] ) throws Exception { String progClass ="com.ailk.dynamic.Demo"; // 创建CompilingClassLoader Class c = Class.forName(progClass, true, new CompilingClassLoader()); //DemoInterface i=(DemoInterface)c.newInstance(); //cl1和cl2是两个不同的ClassLoader ClassLoader cl1=c.getClassLoader(); ClassLoader cl2=Demo.class.getClassLoader(); ClassLoader cl3=DemoInterface.class.getClassLoader(); int ii=0; List<DemoInterface> objList=new ArrayList(); while(true){ ii++; CompilingClassLoader ccl = new CompilingClassLoader(); // 通过CCL加载主函数类。 Class clas = ccl.loadClass( progClass,true); try{ Constructor c1=c.getDeclaredConstructor(new Class[]{String.class}); c1.setAccessible(true); DemoInterface a1=(DemoInterface)c1.newInstance(new Object[]{"Demo"}); }catch(NoSuchMethodException e){ System.out.println("构造函数不存在"); e.printStackTrace(); } DemoInterface instance=null; try{ Constructor c0=clas.getDeclaredConstructor(); c0.setAccessible(true); instance=(DemoInterface)c0.newInstance(); }catch(NoSuchMethodException e){ System.out.println("构造函数不存在"); e.printStackTrace(); } ccl=null;//这里讲主动释放cc1 //DemoInterface instance=(DemoInterface)clas.newInstance(); if (instance!=null) { objList.add(instance); instance.print("demo"); // 利用反射调用它的函数和传递参数。 // 产生一个代表主函数的参数类型的类对象。 Class mainArgType[] = { String.class }; //在类中找函数。 Method method = clas.getMethod( "print", mainArgType ); Object[] argsArray={"Demo"}; //调用方法。 method.invoke(instance, argsArray ); } if (ii>20) { ii=0; objList.clear(); } Thread.sleep(500); //强制gc,只有objList清空后 CompilingClassLoader的实例才会释放。 //因为只有由CompilingClassLoader载入的class的实例全部释放后,CompilingClassLoader才能被释放 System.gc(); } }}