哈,你想改变jar包某个类的运行方式?
或是因为业务需要,或是因为这个jar暂时不能满足你你欲望...
或者只是for Fun!
但是你无法改变这个jar包,可能因为是公用的,可能因为产品的生成依赖于标准仓库,或者仅仅是你不想用 "编译一下你的java类,然后把你的.class替换进去" 这么...这么..这么...的方法,那你要怎么做?
例如:
有类 Feature
public class Feature {
private String content;
public void show() {
System.out.println(this.content);
}
}
及类 Function
public class Function {
private Feature f;
public void show() {
this.f.show();
}
}
测试类 Test,运行结果为 null . 而你想让他输出hello kitty
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Function function = new Function();
function.show();
}
}
最先想到的方法是就是直接建一个同包同名类,在你的eclipse或者其它编译环境下;然后把相关方法,改成自己想要的方法;如下:
public class Feature {
private String content;
public Feature(){
this.content = "hello kitty";
}
public void show() {
System.out.println(this.content);
}
}
然后,你会发现,使用的是你的class吖,而不是jar包里的吖.
但是,如果你的程序也打成jar包,和原jar一起运跑,会是什么情况呢;
你可能发现,会输出 空,如果运气好,也可能 输出 hello kitty ;
为啥呢? 因为当有同包同名类时,classLoader总会尝试先加载到一个,而且加载到这个class文件后,后面就不会再加载;这个先加载到的类一般和classpath设置的先后有关;
在eclipse环境下,会先加载编辑器下的类,然后优先加载,先导入的类库;
如果先加载到你的类,那么就会输出 "hellokitty".
假如需要在生产环境指定加载你的类,
而且,
你无法预知客户如何设置classPath的先后顺序,那么,要怎么办呢?
可否自己写一个classLoader只加载目标类,而让你的调用程序在此classLoader环境下运行?
Let us try try : 先写出这个特别的classLoader
public class HoneyLoader extends URLClassLoader {
public HoneyLoader(URL[] urls, ClassLoader parent){
super(urls, parent);
}
public synchronized Class<?> loadClass(String name) throws ClassNotFoundException {
Class<?> c = findLoadedClass(name);
if (c != null) {
return c;
}
//先自己在指定位置(通过urls指定)找,找不到交给父类
try {
c = this.findClass(name);
} catch (Exception e) {
c = super.loadClass(name);
}
return c;
}
}
回到我们的测试类,修改如下
public class Test {
public static void main(String[] args) throws Exception {
// 根据jar包名称,获取我们需要的jar包的名称的url
String jarName = "feature2.jar";
URL url = null;
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Enumeration<URL> urls = loader.getResources("Feature.class");
int i = 0;
while (urls.hasMoreElements()) {
url = urls.nextElement();
i = url.getPath().indexOf(jarName);
if (i > -1) {
break;
}
}
// 用honeyLoader启动我们的运行环境
ClassLoader myLoader = new HoneyLoader(new URL[] { new URL(url.getPath().substring(0, i) + jarName) }, loader);
Object object = myLoader.loadClass("Feature").newInstance();
object.getClass().getMethod("show").invoke(object);
}
运行结果:
hello kitty
呵呵~ 成功了
---------------------------------------------------------
你能想到其它更简单的办法么?
谁动了你的jar包 (二)
http://ilab.iteye.com/blog/1002629
之 通过反射动态改变类状态
谁动了你的jar包 (三)
http://ilab.iteye.com/blog/1006423
之 那个啥 jvmti !
分享到:
相关推荐
动态加载jar包是一种在程序运行时按需引入外部库或者组件的技术,这使得应用程序更加灵活,可以适应不同的环境和需求。这种技术广泛应用于插件系统、框架开发以及服务升级等场景,因为它允许程序在不重启的情况下...
核心工具是`jarjar-1.4.jar`,这是一个开源工具,专门用于重命名或移动Java类,以便在一个项目中整合多个jar包。通过更改类的包名,我们可以确保即使原始类名相同,也不会相互干扰。`jarjar`的工作原理是通过规则...
`taglibs-jar包`是一个包含了一系列预定义的JSP标签的库,这些标签可以简化网页的编写,提高代码的可读性和可维护性。在本篇文章中,我们将深入探讨`taglibs`及其在Java Web开发中的应用。 首先,我们需要理解什么...
这个压缩包包含了POI项目中所有必要的jar包,总计十二个,确保了对Office文档全面的支持。这些jar包通常在开发需要读写Excel、Word或PowerPoint的Java应用时非常有用。 1. **Apache POI核心库**:`poi-ooxml-...
Struts2是一个强大的Java ...总的来说,Struts2是一个功能强大且成熟的MVC框架,其jar包的引入是搭建Struts2应用的第一步。正确理解和使用这些jar包以及框架的核心概念,能够帮助我们更高效地开发和维护Java Web项目。
可以使用Java内置的`JarFile`类来实现这一功能,也可以借助第三方工具,例如`jdgui_0.3.6`,它是一个可视化的反编译工具,能够帮助开发者查看`jar`包内的类文件源代码。 3. **加载**:在Java程序中,`ClassLoader`...
在Java编程语言中,动态加载jar包是一种常见的需求,它允许程序在运行时根据需要加载新的功能或更新现有的模块,增强了软件的灵活性和可扩展性。动态加载jar包技术主要涉及Java的反射机制、类加载器和插件系统。下面...
在给定的"thymeleaf-jar包"中,包含了一系列依赖的jar文件,这些都是Thymeleaf正常工作所必需的库: 1. `thymeleaf-3.0.12.RELEASE.jar`:这是Thymeleaf的核心库,包含了所有处理模板和表达式的类。版本号3.0.12...
这些jar包的集成使得开发者能够快速搭建一个具备完整功能的Java Web应用,同时简化了开发过程,提高了代码的可维护性和可扩展性。在实际开发中,根据项目需求,开发者可能还需要添加其他的库和框架,例如MyBatis、...
asm动态代理jar包,是java开发的好的工具类
【标题】"Ireport的JAR包"是一个包含多个组件的集合,主要用于报表设计和开发。IReport是一款基于Java的开源报表工具,它允许开发者通过直观的用户界面创建复杂的SQL查询,设计美观的报表,并将其集成到Java应用程序...
2. **log4j jar包**:Log4j是Apache的一个开源日志记录框架,它提供了灵活的日志记录功能。在Java应用程序中,log4j允许开发者定义多个日志级别(如DEBUG、INFO、WARN、ERROR等),并决定在何时何地将这些日志信息...
在Java服务器页面(JSP)开发中,jar包扮演着至关重要的角色,它们包含了运行JSP应用程序所需的类库和API。这些jar包是Java Servlet、JavaServer Pages(JSP)、Java Expression Language(EL)和JavaServer Faces...
在这个场景中,“巴巴运动需要的jar包”指的是该框架或项目所依赖的一系列Java库文件,它们以.jar格式封装,用于提供特定的功能或服务。在Java开发中,jar(Java Archive)文件是Java类库的标准打包格式,包含了编译...
以下是一些在标题和描述中提及的常用JAR包及其详细知识点: 1. **qrcode_java0.50beta10.tar.gz**:这是一个包含QR码生成和解码功能的库,适用于Java项目。它提供了API,允许开发者生成二维码图像,也可以读取并...
Hibernate是一款强大的对象...总之,"hibernate必要的jar包"是一个包含所有必需组件的集合,让开发者能够轻松地在Java项目中实施ORM,通过面向对象的方式来管理和操作数据库,极大地提高了开发效率和代码的可维护性。
《使用jxl.jar包在Java中操作Excel文件的详尽指南》 在Java开发中,与Excel文件交互是一项常见的任务,比如数据导入、导出、分析等。jxl.jar库提供了一个强大的解决方案,使得开发者无需依赖Windows环境即可处理...
在Java环境中使用Thymeleaf时,通常需要引入一系列的jar包来支持其功能。下面将详细介绍Thymeleaf的核心组件以及这些jar包的作用。 1. **Thymeleaf核心库**: - `thymeleaf.jar`:这是Thymeleaf的核心库,包含了...
本资源包含"struts2所有jar包程序文件",是开发者进行Struts2应用开发不可或缺的组件集合。 在Java Web开发中,jar(Java Archive)文件是一种归档格式,用于打包多个类文件和相关的元数据。Struts2框架的jar包通常...