接
谁动了他的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包是一种在程序运行时按需引入外部库或者组件的技术,这使得应用程序更加灵活,可以适应不同的环境和需求。这种技术广泛应用于插件系统、框架开发以及服务升级等场景,因为它允许程序在不重启的情况下...
在Java编程语言中,动态加载jar包是一种常见的需求,它允许程序在运行时根据需要加载新的功能或更新现有的模块,增强了软件的灵活性和可扩展性。动态加载jar包技术主要涉及Java的反射机制、类加载器和插件系统。下面...
asm动态代理jar包,是java开发的好的工具类
在IT行业中,jar包是Java应用程序的标准打包格式,它包含了类文件、资源文件以及元数据。当多个jar包包含相同类名时,可能会引发版本冲突问题。为了应对这种问题,"jar包修改神器"应运而生。这个压缩包文件提供了...
在这个场景中,“巴巴运动需要的jar包”指的是该框架或项目所依赖的一系列Java库文件,它们以.jar格式封装,用于提供特定的功能或服务。在Java开发中,jar(Java Archive)文件是Java类库的标准打包格式,包含了编译...
在Java编程环境中,动态加载jar包是一项重要的技术,它允许我们无需重启服务器就能引入新的功能或更新已有的类。这在大型系统维护和迭代中尤为关键,因为它提高了系统的灵活性和可扩展性。以下是对"动态加载jar包的...
jar动态加载测试包,for Android开发系列之动态添加dex。
"动态树jar包"主要指的是Struts2-jquery-tree-plugin,这是一个专门用于在Struts2应用中创建和管理动态树形视图的插件。它允许用户以交互式的方式展示层次结构的数据,如目录结构、组织架构等,极大地提高了用户体验...
在Java编程中,动态加载JAR或ZIP包是一项重要的技术,它允许程序在运行时根据需求加载外部库,而不是在编译时静态地链接。这种技术对于实现插件化、模块化系统,或者处理频繁更新的组件非常有用。下面将详细讲解如何...
这个压缩包包含了POI项目中所有必要的jar包,总计十二个,确保了对Office文档全面的支持。这些jar包通常在开发需要读写Excel、Word或PowerPoint的Java应用时非常有用。 1. **Apache POI核心库**:`poi-ooxml-...
`taglibs-jar包`是一个包含了一系列预定义的JSP标签的库,这些标签可以简化网页的编写,提高代码的可读性和可维护性。在本篇文章中,我们将深入探讨`taglibs`及其在Java Web开发中的应用。 首先,我们需要理解什么...
Spring bean 一般通过配置文件和注解进行加载,如果要实现jar或class文件,动态实现spring bean 的动态加载,并通过UrlClassLoader完成jar和class文件的加载。可以实现jar的热替换。spring的bean动态加载则需要对...
在使用Struts2进行开发之前,我们需要先将Struts2的jar包引入到项目中,这样才能利用其提供的API和服务。 Struts2的核心jar包通常包括以下几个部分: 1. **struts2-core.jar**:这是Struts2的核心库,包含了框架的...
然后,使用`Class.forName()`方法,指定了要加载的类全名(包括包名)"org.javaweb.url.Url",并传入`URLClassLoader`实例作为上下文类加载器,这样就可以确保这个类是由这个特定的`URLClassLoader`加载的。...
`jar`包解析工具对于开发者来说至关重要,尤其是在处理依赖管理和调试过程中。本篇文章将深入探讨`jar`包解析工具及其在项目开发中的应用。 首先,我们要理解`jar`包的基本结构。一个`jar`文件由一系列的`class`...
"S2SH需要的所有jar包"这个压缩包文件包含了这三个框架以及Java Web开发所需的其他相关库。下面将详细阐述SSH框架的主要组件及其相关的jar包,以及它们在开发中的作用。 1. Struts2:Struts2是一个基于MVC(Model-...
【标题】"Ireport的JAR包"是一个包含多个组件的集合,主要用于报表设计和开发。IReport是一款基于Java的开源报表工具,它允许开发者通过直观的用户界面创建复杂的SQL查询,设计美观的报表,并将其集成到Java应用程序...
在Java服务器页面(JSP)开发中,jar包扮演着至关重要的角色,它们是Java类库的集合,封装了大量的功能,使得开发者能够便捷地利用已有的功能模块进行开发,节省时间和资源。本合集主要针对JSP动态网站开发,同时也...
这个压缩包包含了MyBatis框架运行所必需的jar包,同时也提供了log4j和MySQL数据库连接所需的库,以及可能用于Maven构建系统的相关依赖。以下是对这些关键组件的详细解释: 1. **MyBatis jar包**:MyBatis的核心库...