被动态改变的类如下: public class ScrollImage implements Face {
private static String TEST = "TEST";
public static void change(String change){ TEST=change; } public void myFace(String describe) { }
/** * Constructor for ScrollImage. */ public ScrollImage() { super(); System.out.println(":))"+TEST); show(); } ... 注意 通常使用new ScrollImage()时会输出::))TEST 我的目的要通过类加载来改变它的输出,实际上是改变了静态常量的值,也相当于改变了任何一个实例对该常量的引用值。
先判断该类是否为我们需要动态改变的类 Class cImage; Object oImage; MyLoader loader = new MyLoader();
cImage = loader.load("ScrollImage.class", "cn.com.efly.swt.ScrollImage"); if (Face.class.isAssignableFrom(cImage)) System.out.println(":):)");
改变它: String arg = "changed"; /**也可以通过直接访问常量来改变它,但是要修改常量的可见为public *My ClassLoader: *public class MyLoader extends ClassLoader { * static int maxsize = 10000; * public Class load(String namefile, String classname) * throws java.lang.Exception { * try { * //进行判断这个class是否已经调入,已经有就直接返回,不然就调入 * Class ctmp = this.findLoadedClass(classname); * System.out.println(ctmp.getName() + " is load"); * return ctmp; * } catch (Exception e) { * //System.out.println(e); * } * java.io.FileInputStream in = new java.io.FileInputStream(namefile); * byte[] classbyte = new byte[maxsize]; * //实际应用时完全可以对一个文件进行加解密处理,只要保证使用*defineClass时classbyte中 * //已经解密后的内容就可以 * int readsize; * readsize = in.read(classbyte); * // System.out.println("读文件长:"+readsize); * in.close(); * return defineClass(classname, classbyte, 0, readsize); * } *} */ //cImage.getField("TEST").set(null,"Changed"); java.lang.reflect.Method change = cImage.getMethod("change", new Class[] { String.class }); change.invoke(change, new Object[] { arg }); 实例化该类,可以看到结果: oImage = cImage.newInstance(); 结果输出: :):) :))changed
总结:改方法可以用来解决一些特殊情况下遇到的问题,但是我不鼓励大家使用。在我新的设计中已经不考虑使用改方法,它对结构没有任何好处。
|