`
json20080301
  • 浏览: 166139 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

利用JAVA动态编译重构系统

阅读更多

一个信息系统查询必不可少,如果是定制化的开发那么查询语句还可能是经常变动的;IBATIS提供了这样的sql配置查询的功能;这里有另一种解决方案:利用JAVA动态编译的方式实现SQL语句的配置化!

 

SQL的拼装有时候会很复杂,这个时候如何使用IBATIS的话,就不得不深入学习他的语法,对于新手来说上手就变得困难啦。如果有一种方案可以配置SQL在XML文件中,同时又使用JAVA的语法来拼SQL,那该多好。

 

 

利用JAVA动态编译的方式实现SQL语句的配置化!!!

 

	/**
	 * 编译文件
	 * 
	 * @param file
	 * @throws Exception
	 */
	private String compileFile(File file) throws Exception {
		String classPath = getClassPath();
		String[] arg = {"-classpath", classPath, "-d", classPath,
				file.getAbsolutePath() };
		StringWriter writer = new StringWriter(1024);
		int code = com.sun.tools.javac.Main.compile(arg,
				new PrintWriter(writer));
		return code == 0 ? "0" : writer.toString();
	}

	/**
	 * 创建实例
	 * 
	 * @param file
	 * @return
	 * @throws Exception
	 */
	private SqlBuilder createInstance(File file) throws Exception {
		String filename = file.getName();
		String classname = filename.substring(0, filename.lastIndexOf('.'));
		return (SqlBuilder) Class.forName(packageName + "." + classname)
				.newInstance();
	}

	/**
	 * 删除临时文件
	 * 
	 * @param file
	 * @throws Exception
	 */
	private void removeTempFile(File file) throws Exception {
		String classDir = getClassDir();
		int last = file.getName().lastIndexOf('.');
		String name = file.getName().substring(0, last);
		String classFile = classDir + File.pathSeparator + name + ".java";
		String javaFile = classDir + File.pathSeparator + name + ".class";
		new File(javaFile).delete();
		new File(classFile).delete();
	}

	/**
	 * 取得Class路径
	 * 
	 * @return
	 */
	private String getClassPath() {
//		URL url = this.getClass().getResource("/");
		URL url = Thread.currentThread().getContextClassLoader().getResource("/");
		File file = new File(url.getPath());
		return file.getAbsolutePath();
	}
	
	/**
	 * 生成 JAVA代码片段
	 * @param classname
	 * @param sqlCode
	 * @return
	 */
	private String getJavaCode (String classname ,String sqlCode ){
		StringBuffer code = new StringBuffer(1024);
		code.append("\npackage " + packageName + "; \n");
		code.append("public class " + classname + " implements "
				+ superClass + "{\n");
		code.append("   public String getSql(java.util.Map map) throws Exception{ \n");
		code.append("       " + sqlCode + " \n");
		// 兼容配置中有return语句的SQL
		if (!sqlCode.contains("return ")) {
			code.append("       return sql.toString();\n");
		}
		code.append("   }\n");
		code.append("}\n");
		return code.toString();
	}
	


	/**
	 * 取得Java路径
	 * 
	 * @return
	 */
	private String getClassDir() {
		return getClassPath() + "/" + packageName;
	}
	
	/**
	 * 验证 JAVA语法
	 * @param sqlCode
	 * @return
	 * @throws Exception
	 */
	public String  validateJavaCode ( String sqlCode) throws Exception  {
		log.info("################ Class Dir[" + getClassDir()
				+ "] #################");
		File  file = createFile(sqlCode);
		String classname = file.getName().substring(0, file.getName().lastIndexOf('.'));
		try {
			Debug debug = new Debug("Dyna Complie");
			debug.start("ComplieFile");
			String result = compileFile(file);
			if (!"0".equals(result)) {
				// 保存错误信息
				return "语法验证不通过:\n【\n" + getJavaCode(classname,sqlCode) + "\n】\n"+"验证信息如下:\n【\n" + result + "\n】\n";
			}
			debug.end("ComplieFile");
			log.info(debug);
			return "语法验证通过:\n【\n" + getJavaCode(classname,sqlCode) + "\n】\n" ;
		} catch (Exception e) {
			log.error(e);
			return ("\n【\n" + getJavaCode(classname,sqlCode) + "\n】\n");
		} finally {
			removeTempFile(file);
		}
	}

 

分享到:
评论

相关推荐

    java 反编译软件

    总之,Java反编译软件为开发者提供了宝贵的洞察力,帮助他们理解和利用无法直接访问的代码。然而,使用这些工具时必须谨慎,确保遵循法律和道德规范。通过掌握正确的反编译技巧,开发者可以增强自己的技能,解决棘手...

    Java反编译工具,完美反编译

    描述中的“超级强大”可能是指该工具具有高度的解析准确性和广泛的兼容性,能够处理各种复杂的Java项目,同时,“反编译后可直接利用IED跑”意味着反编译产生的源代码质量高,能够直接在集成开发环境(Integrated ...

    java反编译.zip

    1. Java编译过程 在理解反编译之前,我们先来回顾一下Java的编译过程。Java源代码(.java文件)通过Java编译器(javac)被转换成字节码(.class文件),这个字节码是平台无关的,可以在任何安装了JVM(Java虚拟机)...

    java反编译工具

    Java反编译工具是开发者和逆向工程人员用于查看Java字节码的源代码的工具。在Java中,源代码被编译成....在日常开发工作中,更重要的是编写和维护自己的源代码,并利用版本控制系统(如Git)来跟踪和管理代码变更。

    java反编译工具类

    标签“编译”在这里可能是指反编译过程与常规的Java编译过程相反。Java编译器(javac)将源代码(.java文件)转化为字节码(.class文件),而反编译工具则执行相反的操作,将字节码还原为近似的源代码形式。 在提供...

    java反编译软件

    Java反编译软件是开发者和逆向工程人员用于查看Java字节码源代码的工具,这对于理解已编译的Java程序、学习库的内部工作原理或者在没有...正确理解和使用这些工具,可以帮助我们更好地理解和利用Java世界中的各种资源。

    java反编译工具JD-JUI

    总的来说,JD-JUI作为一款强大的Java反编译工具,是开发者必备的辅助工具之一,尤其在处理没有源码的库时,它能提供宝贵的洞察力,帮助开发者更深入地理解和利用Java生态系统。在日常工作中合理利用,可以显著提升...

    java反编译程序,与eclipse集成

    Java反编译是将已编译的字节码(.class文件)转换回源代码的过程,这对于理解已加密或无源代码的库、研究代码实现或者进行逆向工程时非常有用。Eclipse作为流行的Java集成开发环境(IDE),提供了一些插件来支持这种...

    XJad超级强大的java反编译工具

    Java反编译是将已编译的字节码(.class文件)转换回源代码(.java文件)...了解和掌握XJad有助于我们更好地理解和利用Java字节码,尤其对于那些需要处理旧代码或者进行逆向工程的开发者来说,它是不可或缺的工具之一。

    java .class 类反编译软件

    Java编程语言以其跨平台、面向对象的特性深受开发者喜爱,但在某些情况下,我们可能需要将已编译的`.class`文件还原为可读的`.java`源代码,这就是所谓的反编译。在这种需求下,出现了专门用于反编译Java字节码的...

    java 反编译.java 反编译

    Java反编译是将已编译的字节码...通过了解这些知识点,开发者可以更有效地利用Java反编译工具来辅助开发和维护工作,同时保持对代码的理解和尊重。在实际操作中,选择合适的反编译器,结合其特性,可以提升工作效率。

    推荐--java反编译工具-超级强!

    Java反编译工具是开发者在研究或调试代码时不可或缺的利器,它们可以帮助我们查看和理解已编译的Java字节码,还原出接近原始的Java源代码。标题提到的“推荐--java反编译工具-超级强!”很可能是指一款功能强大、...

    java反编译方法及工具

    Java反编译是一种技术,它允许开发者查看Java字节码...在软件开发过程中,了解反编译技术可以帮助我们更好地理解和利用已有的Java资源。无论是为了学习、调试还是逆向工程,熟练掌握这些工具和流程都能提升我们的技能。

    java反编译工具eclipse插件jad

    3. **JAD的特性**:JAD支持Java 5到Java 8的反编译,并尝试重构原始的Java语法,包括异常处理、泛型和注解。它还提供了对JNI(Java Native Interface)头文件的生成,帮助理解Java与本地代码的交互。 4. **Eclipse...

    java完全反编译工具

    了解和掌握Java反编译工具,对于Java开发者来说是一项重要的技能,它能帮助我们更好地理解和利用已存在的Java资源,提升开发效率和问题解决能力。在使用这些工具时,应遵循相关法律法规,并尊重他人的知识产权。

    Java java8 反编译工具

    `使用说明1-java-jar运行.txt`和`使用说明2-sh脚本运行.txt`提供了详细的使用指南,指导用户如何利用Java的jar命令和Shell脚本来执行反编译操作。这些文档对于不熟悉命令行操作的开发者尤其有用,他们可以通过阅读...

    java反编译文件

    总的来说,Java反编译是一项技术性的实践,它使得开发者能够在没有源代码的情况下理解并利用已有的字节码。通过选择合适的反编译工具,并谨慎使用反编译结果,开发者可以极大地扩展他们的知识和技能,提高开发效率。...

    java类反编译工具系统维护常用工具(使用 )

    Java 类反编译工具在系统维护中扮演着重要的角色,它们允许开发者查看并理解已编译的 `.class` 文件中的代码逻辑,这对于调试、逆向工程、学习第三方库的工作原理或者恢复丢失的源代码非常有用。本文将详细介绍 Java...

    java 反编译 最新

    Java反编译是Java开发中一个重要的技术环节,它允许开发者查看并理解Java字节码,从而揭示出类文件中的源代码逻辑。...通过不断地优化和改进反编译工具,开发者可以更好地理解和利用Java生态系统。

Global site tag (gtag.js) - Google Analytics