为什么80%的码农都做不了架构师?>>>   

前段时间 @绝望的八皮 写了个自动探测model注册插件,见:http://my.oschina.net/b1412/blog/67764 主要功能是为了省去在系统的config中每个model对应表名的配置,通过注解的方式绑定相应的表名,这样做也为将来实现jfinal组件化分离埋下了很好的伏笔,总体来说还是蛮有意义的。遗憾的是可能由于时间原因,八皮没能完成对jar包中class类绑定的扫描,私下联系过说会抽时间做,奈何需求紧急,自己先应付着写了个粗陋的实现,且等八皮优化版本。

基本事先没有修改,唯一修改的是对class扫描的类ClassSeacher,其余参照以上连接实现,就不一一发了。

package net.zfsy.db.plugin;import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;public class ClassSearcher {/*** 递归查找文件* * @param baseDirName*            查找的文件夹路径* @param targetFileName*            需要查找的文件名*/private static List<String> findFiles(String baseDirName,String targetFileName) {/*** 算法简述: 从某个给定的需查找的文件夹出发,搜索该文件夹的所有子文件夹及文件,* 若为文件,则进行匹配,匹配成功则加入结果集,若为子文件夹,则进队列。 队列不空,重复上述操作,队列为空,程序结束,返回结果。*/List<String> classFiles = new ArrayList<String>();String tempName = null;// 判断目录是否存在File baseDir = new File(baseDirName);if (!baseDir.exists() || !baseDir.isDirectory()) {System.out.println("文件查找失败:" + baseDirName + "不是一个目录!");} else {String[] filelist = baseDir.list();for (int i = 0; i < filelist.length; i++) {File readfile = new File(baseDirName + File.separator+ filelist[i]);if (!readfile.isDirectory()) {tempName = readfile.getName();if (ClassSearcher.wildcardMatch(targetFileName, tempName)) {String classname;String tem = readfile.getAbsoluteFile().toString().toString().replaceAll("\\\\", "/");classname = tem.substring(tem.indexOf("/classes")+ "/classes".length(), tem.indexOf(".class"));if (classname.startsWith("/")) {classname = classname.substring(classname.indexOf("/") + 1);}classname = className(classname, "/classes");classFiles.add(classname);}} else if (readfile.isDirectory()) {classFiles.addAll(findFiles(baseDirName + File.separator+ filelist[i], targetFileName));}}}return classFiles;}/*** 查找jar包中的class* @param baseDirName jar路径* @param jarFileURL jar文件地址* @return */public static List<String> findjarFiles(String baseDirName,URL... jarFileURL) {List<String> classFiles = new ArrayList<String>();try {// 判断目录是否存在File baseDir = new File(baseDirName);if (!baseDir.exists() || !baseDir.isDirectory()) {System.out.println("文件查找失败:" + baseDirName + "不是一个目录!");} else {String[] filelist = baseDir.list();for (int i = 0; i < filelist.length; i++) {if (filelist[i].contains("zfplugin")) {//查找含有zfplugin的jar包JarFile localJarFile = new JarFile(new File(baseDirName+ File.separator + filelist[i]));Enumeration<JarEntry> entries = localJarFile.entries();while (entries.hasMoreElements()) {JarEntry jarEntry = entries.nextElement();String entryName = jarEntry.getName();if (jarEntry.isDirectory()) {// System.out.println(entryName);} else if (entryName.endsWith(".class")) {String className = entryName.replaceAll("/",".").substring(0,entryName.length() - 6);classFiles.add(className);}}}}}} catch (IOException e) {e.printStackTrace();}return classFiles;}public static List<Class> findClasses(Class clazz)throws MalformedURLException {List<Class> classList = new ArrayList<Class>();URL classPathUrl = ClassSearcher.class.getResource("/");List<String> classFileList = findFiles(classPathUrl.getFile(),"*.class");String lib = new File(classPathUrl.getFile()).getParent() + "/lib/";List<String> jarclassFiles = findjarFiles(lib, new File(lib).toURL());classFileList.addAll(jarclassFiles);for (String classFile : classFileList) {// String className = className(classFile, "/classes");System.out.println(classFile);try {Class<?> classInFile = Class.forName(classFile);if (classInFile.getSuperclass() == clazz) {classList.add(classInFile);}} catch (ClassNotFoundException e) {e.printStackTrace();}}return classList;}private static String className(String classFile, String pre) {String objStr = classFile.replaceAll("\\\\", "/");return objStr.replaceAll("/", ".");}/*** 通配符匹配* * @param pattern*            通配符模式* @param str*            待匹配的字符串* @return  匹配成功则返回true,否则返回false*/private static boolean wildcardMatch(String pattern, String str) {int patternLength = pattern.length();int strLength = str.length();int strIndex = 0;char ch;for (int patternIndex = 0; patternIndex < patternLength; patternIndex++) {ch = pattern.charAt(patternIndex);if (ch == '*') {// 通配符星号*表示可以匹配任意多个字符while (strIndex < strLength) {if (wildcardMatch(pattern.substring(patternIndex + 1),str.substring(strIndex))) {return true;}strIndex++;}} else if (ch == '?') {// 通配符问号?表示匹配任意一个字符strIndex++;if (strIndex > strLength) {// 表示str中已经没有字符匹配?了。return false;}} else {if ((strIndex >= strLength) || (ch != str.charAt(strIndex))) {return false;}strIndex++;}}return (strIndex == strLength);}public static void main(String[] args) throws MalformedURLException {// URL classPathUrl = ClassSearcher.class.getResource("/");// String baseDirName = new File(classPathUrl.getFile()).getParent()// + "/lib/";// URL url = new File(baseDirName).toURL();// ClassSearcher.findjarFiles(baseDirName, url);//ClassSearcher.findClasses(Demo.class);}
}

转载于:https://my.oschina.net/mousai/blog/81021

JFinal自动扫描表绑定model(包含jar包扫描)相关推荐

  1. jar包扫描工具: gamma

    1. 简介 本项目是一个jar包扫描工具,可以支持插件化订制不同的扫描逻辑 支持以下功能: 插件化订制扫描逻辑,让扩展更加容易 将扫描到的文件加载到jvm中以class的形式返回给处理插件,让扫描逻辑 ...

  2. Jdbc工具类的打包(包含jar包分享)

    把jdbc封装的所有代码打成独立jar包,以后直接引用jar. 点击领取jar包以及配置文件 (1)创建一个新的工程 (2)创建包结构 打包 工具包 核心的代码:Jdbc.jar src配置文件 :d ...

  3. 网络爬虫相关程序学习(包含jar包等)---各大网站网络爬虫

    以下内容,都是本人近一年写过的东西,也算花了不少时间.所以,源码并不是免费的,但很便宜.有需要的请邮箱联系:1563178220@qq.com.另外,可以辅助编写其他网络爬虫工程. 网络爬虫基础学习 ...

  4. java jacob下载_jacob下载包含jar包和src

    下载 解压后获得3个文件 jacob.jar jacob-1.17-x64.dll jacob-1.17-x86.dll jacob.jar 放到项目的lib目录 win7 jacob-1.17-x6 ...

  5. java pdf转txt【完整代码包含jar包】

    一.POM 二.代码 三.效果 一.POM文件 <dependency><groupId>org.apache.pdfbox</groupId><artifa ...

  6. 通过插件自动将maven项目打成jar包的同时将当前项目依赖的第三方Jar包一起打包

    1.添加插件 <build><plugins><!-- 如果已经在Maven的全局配置中,配置了JDK编译的界别,这个插件可以省略 --><!-- <p ...

  7. flink sql udf jar包_编写Hive的UDF(查询平台数据同时向mysql添加数据)

    可能会有一些截图中会有错误提示,是因为本地的包一直包下载有问题,截完图已经下载好了. 创建包结构 创建一个基础信息类 所有输出到mysql数据库中的自定义MR任务的自定义key均需要实现该抽象类 代码 ...

  8. spring相关jar包(Free)

    包含jar包: 1.com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar 2.commons-logging-1.2.jar 3.com.spri ...

  9. java json解析jar包,解析json常用jar包

    13.轻量级的 JSON API:内置了一个轻量级的 JSON API 14.响... 1.加入 Jackson.jar? 2.在配置文件中配置 json 的映射? 3... 和json都是一种数据交 ...

最新文章

  1. 设计模式 - Iterator(迭代器)
  2. eclipse启动报JVM terminated. Exit code=-1的解决方法
  3. python123平台作业答案第十一周_第十一周作业
  4. Apache ZooKeeper - 选举Leader源码流程深度解析
  5. Divine Array 思维,模拟,结论
  6. python3的3D开发-基于blender(1)
  7. PL/SQL Developer如何连接64位的Oracle图解
  8. jep290涉及jdk版本_针对JDK 14提议的另外六个JEP
  9. docker 中不能用vim编辑文件
  10. 数组排列组合算法汇总
  11. 在ORACLE中找出并批量编译失效的对象
  12. sql 去除数据表中一列中字符串后边的空格...
  13. .NET程序员应掌握的常用类库
  14. 浅谈软件外包项目报价
  15. VS-RK3399 and VS-RK3288 Audio 开发指南
  16. 小程序图片上传及预览和删除
  17. command/cmd命令大全
  18. 大学英语综合教程一 Unit 2 课文内容英译中 中英翻译
  19. CC2541之串口(转)
  20. cve-2020-7066简单解析

热门文章

  1. linux创建环境变量有什么用,环境变量和shell变量到底有什么区别呢?
  2. c语言报刊杂志订阅系统,中国报刊杂志大全_报刊大全_报刊杂志订阅
  3. java向hdfs提交命令_Java语言操作HDFS常用命令测试代码
  4. 坐标轨迹计算_三坐标测量机控制系统功能介绍
  5. linux操作系统说课稿,信息技术《揭开LINUX的神秘面纱》教案范文
  6. mysql 5.6.26 驱动_mysql版本引起的驱动问题
  7. cdr圆形渐变填充怎么设置_玩出新花样|渐变应用于形状
  8. python小白教程-面向小白的Python教程:入门篇(六)
  9. frontcon函数用不了_MQL4课程——账户信息函数和检测函数
  10. 蒙文字体怎么安装_我们来聊一聊iOS13的“字体”该怎么用?