技术开发 频道

在类被实例化之前动态改变其静态的常量

  【IT168 技术文档】被动态改变的类如下:

  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

  总结:改方法可以用来解决一些特殊情况下遇到的问题,但是我不鼓励大家使用。在我新的设计中已经不考虑使用改方法,它对结构没有任何好处。

0
相关文章