`
yfyh87
  • 浏览: 35173 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

谁动了他的jar包 (二)

阅读更多

谁动了他的jar包(一) http://ilab.iteye.com/blog/984823


谁动了他的jar包(三) http://ilab.iteye.com/blog/1006423

用classLoader的方法,将建立一个小的运行机制,和业务代码的相关性很低,冗余代码多;
而且,新建的和原类相同的包名和类不便于维护;

有什么更好的方法么?


对于(一)中描述的需求,其实,我们只需改变下Feature的私有属性content,是否可以通过反射来实现呢?

尝试以下代码:

public class Test {

    // 获取object 的属性 fieldName
    public static Field getField(Object object, String fieldName) throws Exception {
        Field field = object.getClass().getDeclaredField(fieldName);
        return field;
    }

    public static void main(String[] args) throws Exception {
        Function function = new Function();  
        // 获取function的feature  
        Field f_feature = getField(function, "f");  
  
        // 通过feature 获取 其属性 content  
        f_feature.setAccessible(true);  
        Field f_content = getField(f_feature.get(function), "content");  
  
        // 改变content的内容  
        f_content.setAccessible(true);  
        f_content.set(f_feature.get(function), "hello kitty");  
  
        function.show();
    }
}


执行,得到结果
hello kitty


冗余代码减少,目的更加明确了,但对于改变的业务代码,任然不清晰;不容易维护;

通常,如果我们要得到有我们的特性的类,会用继承的方法,但是有时候,会发现,如果是你要调用的调用的调用的类,要改变一点动作,那你为了改调用的调用的调用,不得不继承调用和调用的调用;

假如我们只改变目标类,只继承目标类,结合反射的方式,改调用,是否可行呢?

例如,继承Feature创建类MyFeature


public class MyFeature extends Feature {

    private String mycontent;

    public MyFeature(){
        this.mycontent = "hello kitty";
    }

    public void show() {
        System.out.println(this.mycontent);
    }
}


这样我们改变的逻辑清晰很多,然后只要把MyFeature替掉Function中的feature(此时指向类型还是feature)就OK了. 如下 :

public class Test {

    // 获取object 的属性 fieldName
    public static Field getField(Object object, String fieldName) throws Exception {
        Field field = object.getClass().getDeclaredField(fieldName);
        return field;
    }

    public static void main(String[] args) throws Exception {
        Function function = new Function();
        // 获取function的feature
        Field f_feature = getField(function, "f");

        // 改变feature的内容
        f_feature.setAccessible(true);
        f_feature.set(function, new MyFeature());

        function.show();
    }
}


此时,Test的逻辑也清晰很多,我们可以清楚的看到,我们需要改变哪个类

运行一下,看下结果


 hello kitty 



16
4
分享到:
评论
8 楼 xieye 2011-05-06  
可怜的java程序员,一个小功能费那么多事
7 楼 yfyh87 2011-04-29  
limafa 写道
颜色有点太艳

多谢提供
6 楼 limafa 2011-04-27  
颜色有点太艳
5 楼 limafa 2011-04-27  
试试这个字体怎么样
4 楼 yfyh87 2011-04-20  
hastune 写道
f_content.setAccessible(true);

关键是这个。博主辛苦了


嗯,是的,反射其实允许我们修改某些私有的东西,但是final的就不行了
3 楼 hastune 2011-04-19  
f_content.setAccessible(true);

关键是这个。博主辛苦了
2 楼 forever8tf 2011-04-16  
这种方法对开源的jar包小范围的再次开发是一种利器啊!!!马上运用了!
1 楼 s929498110 2011-04-15  
Mark, 以后看看。 

相关推荐

Global site tag (gtag.js) - Google Analytics