一个信息系统查询必不可少,如果是定制化的开发那么查询语句还可能是经常变动的;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项目,同时,“反编译后可直接利用IED跑”意味着反编译产生的源代码质量高,能够直接在集成开发环境(Integrated ...
1. Java编译过程 在理解反编译之前,我们先来回顾一下Java的编译过程。Java源代码(.java文件)通过Java编译器(javac)被转换成字节码(.class文件),这个字节码是平台无关的,可以在任何安装了JVM(Java虚拟机)...
Java反编译工具是开发者和逆向工程人员用于查看Java字节码的源代码的工具。在Java中,源代码被编译成....在日常开发工作中,更重要的是编写和维护自己的源代码,并利用版本控制系统(如Git)来跟踪和管理代码变更。
标签“编译”在这里可能是指反编译过程与常规的Java编译过程相反。Java编译器(javac)将源代码(.java文件)转化为字节码(.class文件),而反编译工具则执行相反的操作,将字节码还原为近似的源代码形式。 在提供...
Java反编译软件是开发者和逆向工程人员用于查看Java字节码源代码的工具,这对于理解已编译的Java程序、学习库的内部工作原理或者在没有...正确理解和使用这些工具,可以帮助我们更好地理解和利用Java世界中的各种资源。
总的来说,JD-JUI作为一款强大的Java反编译工具,是开发者必备的辅助工具之一,尤其在处理没有源码的库时,它能提供宝贵的洞察力,帮助开发者更深入地理解和利用Java生态系统。在日常工作中合理利用,可以显著提升...
Java反编译是将已编译的字节码(.class文件)转换回源代码的过程,这对于理解已加密或无源代码的库、研究代码实现或者进行逆向工程时非常有用。Eclipse作为流行的Java集成开发环境(IDE),提供了一些插件来支持这种...
Java反编译是将已编译的字节码(.class文件)转换回源代码(.java文件)...了解和掌握XJad有助于我们更好地理解和利用Java字节码,尤其对于那些需要处理旧代码或者进行逆向工程的开发者来说,它是不可或缺的工具之一。
Java编程语言以其跨平台、面向对象的特性深受开发者喜爱,但在某些情况下,我们可能需要将已编译的`.class`文件还原为可读的`.java`源代码,这就是所谓的反编译。在这种需求下,出现了专门用于反编译Java字节码的...
Java反编译是将已编译的字节码...通过了解这些知识点,开发者可以更有效地利用Java反编译工具来辅助开发和维护工作,同时保持对代码的理解和尊重。在实际操作中,选择合适的反编译器,结合其特性,可以提升工作效率。
Java反编译工具是开发者在研究或调试代码时不可或缺的利器,它们可以帮助我们查看和理解已编译的Java字节码,还原出接近原始的Java源代码。标题提到的“推荐--java反编译工具-超级强!”很可能是指一款功能强大、...
Java反编译是一种技术,它允许开发者查看Java字节码...在软件开发过程中,了解反编译技术可以帮助我们更好地理解和利用已有的Java资源。无论是为了学习、调试还是逆向工程,熟练掌握这些工具和流程都能提升我们的技能。
3. **JAD的特性**:JAD支持Java 5到Java 8的反编译,并尝试重构原始的Java语法,包括异常处理、泛型和注解。它还提供了对JNI(Java Native Interface)头文件的生成,帮助理解Java与本地代码的交互。 4. **Eclipse...
了解和掌握Java反编译工具,对于Java开发者来说是一项重要的技能,它能帮助我们更好地理解和利用已存在的Java资源,提升开发效率和问题解决能力。在使用这些工具时,应遵循相关法律法规,并尊重他人的知识产权。
`使用说明1-java-jar运行.txt`和`使用说明2-sh脚本运行.txt`提供了详细的使用指南,指导用户如何利用Java的jar命令和Shell脚本来执行反编译操作。这些文档对于不熟悉命令行操作的开发者尤其有用,他们可以通过阅读...
总的来说,Java反编译是一项技术性的实践,它使得开发者能够在没有源代码的情况下理解并利用已有的字节码。通过选择合适的反编译工具,并谨慎使用反编译结果,开发者可以极大地扩展他们的知识和技能,提高开发效率。...
Java 类反编译工具在系统维护中扮演着重要的角色,它们允许开发者查看并理解已编译的 `.class` 文件中的代码逻辑,这对于调试、逆向工程、学习第三方库的工作原理或者恢复丢失的源代码非常有用。本文将详细介绍 Java...
Java反编译是Java开发中一个重要的技术环节,它允许开发者查看并理解Java字节码,从而揭示出类文件中的源代码逻辑。...通过不断地优化和改进反编译工具,开发者可以更好地理解和利用Java生态系统。