赛迪网 > IT技术 Java > JJ2EE介绍
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

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

发布时间:2007.12.14 05:03     来源:赛迪网技术社区    作者:efly

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

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


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 在.properties属性文件中存取设置参数 (12-13) · 关于Java 语言中的 return 语句的讨论 (12-13)
· 关于 Java 连接常见数据库的连接字符串 (12-13) · 进阶:深入浅析关于如何jar的一点总结 (12-13)
· JAVA基础--Java语言中关于修饰词总结 (12-13) · 给初学者的文章--初学Java注意什么? (12-13)
· 程序人生:初学者如何才算真正掌握Java (12-13) · JAVA基础:JAVA中对象和简单数据对象 (12-13)
· 将java对象转为java String的几种方法 (12-13) · Java语言中的强大武器--对象的序列化 (12-13)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
· 信息化市场百家争鸣 SaaS深陷争议“泥潭”
· 提高管理水平 "两栖"CIO应具备的六大能力
· 国产ITIL运维先行者 四大厂商角力BI市场
· 金融行业GSN专题解决方案 企业网解决方案
  IT博客 ·曾剑秋·项立刚·Java学习·网管
  IT技术论坛 ·开发·网管·安全·数据库·系统