接
谁动了他的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]
执行,得到结果
[b]冗余代码减少,目的更加明确了,但对于改变的业务代码,任然不清晰;不容易维护;
通常,如果我们要得到有我们的特性的类,会用继承的方法,但是有时候,会发现,如果是你要调用的调用的调用的类,要改变一点动作,那你为了改调用的调用的调用,不得不继承调用和调用的调用;
假如我们只改变目标类,只继承目标类,结合反射的方式,改调用,是否可行呢?
例如,继承Feature创建类MyFeature
[/b]
[b]这样我们改变的逻辑清晰很多,然后只要把MyFeature替掉Function中的feature(此时指向类型还是feature)就OK了. 如下 : [/b]
[b]此时,Test的逻辑也清晰很多,我们可以清楚的看到,我们需要改变哪个类
运行一下,看下结果 :)
[/b]
谁动了他的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