`
yfyh87
  • 浏览: 35461 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

谁动了他的jar包 (二)

阅读更多

谁动了他的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 



16
4
分享到:
评论
8 楼 xieye 2011-05-06  
可怜的java程序员,一个小功能费那么多事
7 楼 yfyh87 2011-04-29  
limafa 写道
颜色有点太艳

多谢提供
6 楼 limafa 2011-04-27  
颜色有点太艳
5 楼 limafa 2011-04-27  
试试这个字体怎么样
4 楼 yfyh87 2011-04-20  
hastune 写道
f_content.setAccessible(true);

关键是这个。博主辛苦了


嗯,是的,反射其实允许我们修改某些私有的东西,但是final的就不行了
3 楼 hastune 2011-04-19  
f_content.setAccessible(true);

关键是这个。博主辛苦了
2 楼 forever8tf 2011-04-16  
这种方法对开源的jar包小范围的再次开发是一种利器啊!!!马上运用了!
1 楼 s929498110 2011-04-15  
Mark, 以后看看。 

相关推荐

    动态加载jar包

    动态加载jar包是一种在程序运行时按需引入外部库或者组件的技术,这使得应用程序更加灵活,可以适应不同的环境和需求。这种技术广泛应用于插件系统、框架开发以及服务升级等场景,因为它允许程序在不重启的情况下...

    java 动态加载jar包

    在Java编程语言中,动态加载jar包是一种常见的需求,它允许程序在运行时根据需要加载新的功能或更新现有的模块,增强了软件的灵活性和可扩展性。动态加载jar包技术主要涉及Java的反射机制、类加载器和插件系统。下面...

    asm动态代理jar包

    asm动态代理jar包,是java开发的好的工具类

    jar包修改神器.rar

    在IT行业中,jar包是Java应用程序的标准打包格式,它包含了类文件、资源文件以及元数据。当多个jar包包含相同类名时,可能会引发版本冲突问题。为了应对这种问题,"jar包修改神器"应运而生。这个压缩包文件提供了...

    巴巴运动需要的jar包

    在这个场景中,“巴巴运动需要的jar包”指的是该框架或项目所依赖的一系列Java库文件,它们以.jar格式封装,用于提供特定的功能或服务。在Java开发中,jar(Java Archive)文件是Java类库的标准打包格式,包含了编译...

    动态加载jar包的实现

    在Java编程环境中,动态加载jar包是一项重要的技术,它允许我们无需重启服务器就能引入新的功能或更新已有的类。这在大型系统维护和迭代中尤为关键,因为它提高了系统的灵活性和可扩展性。以下是对"动态加载jar包的...

    jar动态加载测试包

    jar动态加载测试包,for Android开发系列之动态添加dex。

    动态树jar包

    "动态树jar包"主要指的是Struts2-jquery-tree-plugin,这是一个专门用于在Struts2应用中创建和管理动态树形视图的插件。它允许用户以交互式的方式展示层次结构的数据,如目录结构、组织架构等,极大地提高了用户体验...

    JAVA动态加载JAR zip包

    在Java编程中,动态加载JAR或ZIP包是一项重要的技术,它允许程序在运行时根据需求加载外部库,而不是在编译时静态地链接。这种技术对于实现插件化、模块化系统,或者处理频繁更新的组件非常有用。下面将详细讲解如何...

    POI poi相关所有jar包 poi jar包 poi最全jar包

    这个压缩包包含了POI项目中所有必要的jar包,总计十二个,确保了对Office文档全面的支持。这些jar包通常在开发需要读写Excel、Word或PowerPoint的Java应用时非常有用。 1. **Apache POI核心库**:`poi-ooxml-...

    taglibs-jar包

    `taglibs-jar包`是一个包含了一系列预定义的JSP标签的库,这些标签可以简化网页的编写,提高代码的可读性和可维护性。在本篇文章中,我们将深入探讨`taglibs`及其在Java Web开发中的应用。 首先,我们需要理解什么...

    Spring bean 动态注册,jar包热替换

    Spring bean 一般通过配置文件和注解进行加载,如果要实现jar或class文件,动态实现spring bean 的动态加载,并通过UrlClassLoader完成jar和class文件的加载。可以实现jar的热替换。spring的bean动态加载则需要对...

    struts2jar包

    在使用Struts2进行开发之前,我们需要先将Struts2的jar包引入到项目中,这样才能利用其提供的API和服务。 Struts2的核心jar包通常包括以下几个部分: 1. **struts2-core.jar**:这是Struts2的核心库,包含了框架的...

    Java URLClassLoader动态加载jar包1

    然后,使用`Class.forName()`方法,指定了要加载的类全名(包括包名)"org.javaweb.url.Url",并传入`URLClassLoader`实例作为上下文类加载器,这样就可以确保这个类是由这个特定的`URLClassLoader`加载的。...

    jar包解析工具

    `jar`包解析工具对于开发者来说至关重要,尤其是在处理依赖管理和调试过程中。本篇文章将深入探讨`jar`包解析工具及其在项目开发中的应用。 首先,我们要理解`jar`包的基本结构。一个`jar`文件由一系列的`class`...

    S2SH需要的所有jar包

    "S2SH需要的所有jar包"这个压缩包文件包含了这三个框架以及Java Web开发所需的其他相关库。下面将详细阐述SSH框架的主要组件及其相关的jar包,以及它们在开发中的作用。 1. Struts2:Struts2是一个基于MVC(Model-...

    Ireport 的 JAR包

    【标题】"Ireport的JAR包"是一个包含多个组件的集合,主要用于报表设计和开发。IReport是一款基于Java的开源报表工具,它允许开发者通过直观的用户界面创建复杂的SQL查询,设计美观的报表,并将其集成到Java应用程序...

    JSP动态网站开发常用jar包完美合集。

    在Java服务器页面(JSP)开发中,jar包扮演着至关重要的角色,它们是Java类库的集合,封装了大量的功能,使得开发者能够便捷地利用已有的功能模块进行开发,节省时间和资源。本合集主要针对JSP动态网站开发,同时也...

    myBaits所有jar包,包括log4j所需jar包,mysql所需jar包,导入后可以直接使用

    这个压缩包包含了MyBatis框架运行所必需的jar包,同时也提供了log4j和MySQL数据库连接所需的库,以及可能用于Maven构建系统的相关依赖。以下是对这些关键组件的详细解释: 1. **MyBatis jar包**:MyBatis的核心库...

Global site tag (gtag.js) - Google Analytics