服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

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

被动态改变的类如下:
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

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