谁动了他的jar包 (二)


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


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

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

有什么更好的方法么?[/b]

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

尝试以下代码: [/b]
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


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

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

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

例如,继承Feature创建类MyFeature

[/b]
public class MyFeature extends Feature {

private String mycontent;

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

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


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

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();
}
}


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

运行一下,看下结果 :)
[/b]

 hello kitty 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值