接
谁动了他的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
分享到:
相关推荐
通过动态加载jar包的方式,反射调用内部方法
asm动态代理jar包,是java开发的好的工具类
巴巴运动需要的jar包,好大呀,希望对大家有帮助
jar动态加载测试包,for Android开发系列之动态添加dex。
cglib-nodep-2.1_3.jar、asm-2.2.3.jar、asm-commons-2.2.3.jar、asm-util-2.2.3.jar四个包
springboot动态加载jar包到容器中,并映射为接口对外提供服务
一个工具类实现了动态加载jar包 在不重启服务器的情况下,可以调用jar包的class
JAVA动态加载JAR,zip包例子 有在项目中用到
CGlib动态代理 jar包 用于动态代理技术
可修改jar包内package包名,解决jar包不同版本冲突
Spring bean 一般通过配置文件和注解进行加载,如果要实现jar或class文件,动态实现spring bean 的动态加载,并通过UrlClassLoader完成jar和class文件的加载。可以实现jar的热替换。spring的bean动态加载则需要对...
JDK动态代理必须提供接口才能使用,在一些不能提供接口的环境中,只能采用其他第三方技术,比如CGLIB动态代理,这里提供CGLIB动态代理的相关jar包,供学习和测试使用。
NULL 博文链接:https://hoochiang.iteye.com/blog/2249816
struts2-jquery-plugin-3.1.1.jar; struts2-jquery-tree-plugin-3.1.1.jar; 两个jar包
动态代理cglibjar包和源码动态代理cglibjar包和源码动态代理cglibjar包和源码动态代理cglibjar包和源码动态代理cglibjar包和源码
这个jar包可以实现对帆软报表里的类的方法进行拦截。
有些项目需要(根据机型)动态加入jar包,该资源包含了一个在android工程中动态加载jar文件的小程序,注释详细,需要注意我们的jar文件是需要经过dx处理过的,可参考博客:...
android里面进行动画播放的jar包。
提供了JSP动态网站开发时及其它动态网站开发时用到的jar包,其中包括SQL数据库常用的jar包。