在类被实例化前动态改变其静态常量efly 原创 (参与分:1044,专家分:1840) 发表:2002-11-13 下午5:37 更新:2002-11-14 下午5:02 版本:1.1 阅读:3118次 <script type=text/javascript> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript> </script> 被动态改变的类如下: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总结:改方法可以用来解决一些特殊情况下遇到的问题,但是我不鼓励大家使用。在我新的设计中已经不考虑使用改方法,它对结构没有任何好处。