接
谁动了他的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开发的好的工具类
### Spring Boot 动态加载 Jar 包到容器中并映射为接口的技术解析 #### 一、背景介绍 在实际的开发过程中,我们经常会遇到这样的需求:系统需要根据不同的业务场景来动态地加载不同的功能模块或者组件。这些功能...
在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-...
然后,使用`Class.forName()`方法,指定了要加载的类全名(包括包名)"org.javaweb.url.Url",并传入`URLClassLoader`实例作为上下文类加载器,这样就可以确保这个类是由这个特定的`URLClassLoader`加载的。...
`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的核心库,包含了框架的...
`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动态网站开发,同时也...