被動(dòng)態(tài)改變的類如下: 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()時(shí)會(huì)輸出::))TEST 我的目的要通過(guò)類加載來(lái)改變它的輸出,實(shí)際上是改變了靜態(tài)常量的值,也相當(dāng)于改變了任何一個(gè)實(shí)例對(duì)該常量的引用值。
先判斷該類是否為我們需要?jiǎng)討B(tài)改變的類 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"; /**也可以通過(guò)直接訪問(wèn)常量來(lái)改變它,但是要修改常量的可見(jiàn)為public *My ClassLoader: *public class MyLoader extends ClassLoader { * static int maxsize = 10000; * public Class load(String namefile, String classname) * throws java.lang.Exception { * try { * //進(jìn)行判斷這個(gè)class是否已經(jīng)調(diào)入,已經(jīng)有就直接返回,不然就調(diào)入 * 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]; * //實(shí)際應(yīng)用時(shí)完全可以對(duì)一個(gè)文件進(jìn)行加解密處理,只要保證使用*defineClass時(shí)classbyte中 * //已經(jīng)解密后的內(nèi)容就可以 * int readsize; * readsize = in.read(classbyte); * // System.out.println("讀文件長(zhǎng):"+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 }); 實(shí)例化該類,可以看到結(jié)果: oImage = cImage.newInstance(); 結(jié)果輸出: :):) :))changed
總結(jié):改方法可以用來(lái)解決一些特殊情況下遇到的問(wèn)題,但是我不鼓勵(lì)大家使用。在我新的設(shè)計(jì)中已經(jīng)不考慮使用改方法,它對(duì)結(jié)構(gòu)沒(méi)有任何好處。
|