在类被实例化前动态改变其静态常量
被动态改变的类如下:
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
总结:改方法可以用来解决一些特殊情况下遇到的问题,但是我不鼓励大家使用。在我新的设计中已经不考虑使用改方法,它对结构没有任何好处。
补充:软件开发 , Java ,