package com.liuxiang.velocity.util;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
public class _ClassUtils {
private static final String CLASS_EXT = ".class";
private static final String JAR_FILE_EXT = ".jar";
private static final String ERROR_MESSAGE = "packageName can't be null";
private static final String DOT = ".";
private static final String ZIP_SLASH = "/";
private static final String BLACK = "";
private static final ClassFilter NULL_CLASS_FILTER = null;
/**(1) 文件过滤器,过滤掉不需要的文件**/
private static FileFilter fileFilter = new FileFilter() {
public boolean accept(File pathname) {
return isClass(pathname.getName()) || isDirectory(pathname) || isJarFile(pathname.getName());
}
};
/**
* 如果packageName为空,就抛出空指针异常。</br>
* (本工具类有一个bug,如果扫描文件时需要一个包路径为截取字符串的条件,现在还没有修复,所以加上该条件)
*
* @param packageName
*/
private static void ckeckNullPackageName(String packageName) {
if (packageName == null || packageName.trim().length() == 0)
throw new NullPointerException(ERROR_MESSAGE);
}
/**
* 改变 com -> com. 避免在比较的时候把比如 completeTestSuite.class类扫描进去,如果没有.
* </br>那如果class里面由一个com也会被扫描进去
* 其实就是包名称后面或前面需要一个 .
* @param packageName
* @return
*/
private static String getWellFormedPackageName(String packageName) {
return packageName.lastIndexOf(DOT) != packageName.length() - 1 ? packageName + DOT : packageName;
}
/**
* 扫面包路径下满足class过滤器条件的所有class文件,</br> 如果包路径为 com.abs + A.class
* 但是输入 abs 会产生classNotFoundException</br> 因为className 应该为 com.abs.A 现在却成为
* abs.A,此工具类对该异常进行忽略处理,有可能是一个不完善的地方,以后需要进行修改</br>
* @param packageName 包路径 com | com. | com.abs | com.abs.
* @param classFilter class过滤器,过滤掉不需要的class
* @return
*/
public static List<Class> scanPackage(String packageName,ClassFilter classFilter) {
//检测packageName 是否为空,如果为空就抛出NullPointException
ckeckNullPackageName(packageName);
//实例化一个篮子 P: 放置class
final List<Class> classes = new ArrayList<Class>();
// 遍历在classpath 下面的jar包,class文件夹(现在没有包括 java jre)
for (String classPath : getClassPathArray()) {
// 填充 classes
fillClasses(new File(classPath), getWellFormedPackageName(packageName),classFilter, classes);
}
return classes;
}
/**
* 扫面改包路径下所有class文件
* @param packageName 包路径 com | com. | com.abs | com.abs.
* @return
*/
public static List<Class> scanPackage(String packageName) {
return scanPackage(packageName, NULL_CLASS_FILTER);
}
/**
* 填充满足条件的class 填充到 classes
*
* @param file 类路径下的文件
* @param packageName 需要扫面的包名
* @param classFilter class过滤器
* @param classes List 集合
*/
private static void fillClasses(File file, String packageName,ClassFilter classFilter, List<Class> classes) {
if (isDirectory(file)) {
processDirectory(file, packageName, classFilter, classes);
} else if (isClass(file.getName())) {
processClassFile(file, packageName, classFilter, classes);
} else if (isJarFile(file.getName())) {
processJarFile(file, packageName, classFilter, classes);
}
}
/**
* 处理如果为目录的情况,需要递归调用 fillClasses方法
*
* @param directory
* @param packageName
* @param classFilter
* @param classes
*/
private static void processDirectory(File directory, String packageName,ClassFilter classFilter, List<Class> classes) {
for (File file : directory.listFiles(fileFilter)) {
fillClasses(file, packageName, classFilter, classes);
}
}
/**
* 处理为class文件的情况,填充满足条件的class 到 classes
*
* @param file
* @param packageName
* @param classFilter
* @param classes
*/
private static void processClassFile(File file, String packageName,ClassFilter classFilter, List<Class> classes) {
final String filePathWithDot = file.getAbsolutePath().replace(File.separator, DOT);
int subIndex = -1;
if ((subIndex = filePathWithDot.indexOf(packageName)) != -1) {
final String className = filePathWithDot.substring(subIndex).replace(CLASS_EXT, BLACK);
fillClass(className, packageName, classes, classFilter);
}
}
/**
* 处理为jar文件的情况,填充满足条件的class 到 classes
*
* @param file
* @param packageName
* @param classFilter
* @param classes
*/
private static void processJarFile(File file, String packageName,ClassFilter classFilter, List<Class> classes) {
try {
for (ZipEntry entry : Collections.list(new ZipFile(file).entries())) {
if (isClass(entry.getName())) {
final String className = entry.getName().replace(ZIP_SLASH, DOT).replace(CLASS_EXT, BLACK);
fillClass(className, packageName, classes, classFilter);
}
}
} catch (Exception ex) {
}
}
/**
* 填充class 到 classes
*
* @param className
* @param packageName
* @param classes
* @param classFilter
*/
private static void fillClass(String className, String packageName,List<Class> classes, ClassFilter classFilter) {
if (checkClassName(className, packageName)) {
try {
final Class clazz = Class.forName(className, Boolean.FALSE,_ClassUtils.class.getClassLoader());
if (checkClassFilter(classFilter, clazz)) {
classes.add(clazz);
}
} catch (ClassNotFoundException ex) {
}
}
}
private static String[] getClassPathArray() {
// System.getProperty("java.home"); 不包括 jre
return System.getProperty("java.class.path").split(System.getProperty("path.separator"));
}
private static boolean checkClassName(String className, String packageName) {
return className.indexOf(packageName) == 0;
}
private static boolean checkClassFilter(ClassFilter classFilter, Class clazz) {
return classFilter == NULL_CLASS_FILTER || classFilter.accept(clazz);
}
private static boolean isClass(String fileName) {
return fileName.endsWith(CLASS_EXT);
}
private static boolean isDirectory(File file) {
return file.isDirectory();
}
private static boolean isJarFile(String fileName) {
return fileName.endsWith(JAR_FILE_EXT);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
velocity-web模板工具
共91个文件
class:31个
java:27个
vm:12个
3星 · 超过75%的资源 需积分: 14 19 下载量 179 浏览量
2016-09-10
23:12:27
上传
评论 1
收藏 65KB RAR 举报
温馨提示
velocity-web模板工具, 参考:http://blog.csdn.net/nature_fly088/article/details/52497779 和http://www.ibm.com/developerworks/cn/java/j-lo-velocity1/
资源推荐
资源详情
资源评论
收起资源包目录
velocity-web.rar (91个子文件)
velocity-web
pom.xml 2KB
target
test-classes
com
liuxiang
velocity
util
test
ClassUtilsTest$1.class 881B
ApplicationContextTest.class 1KB
ClassUtilsTest.class 1KB
m2e-wtp
web-resources
META-INF
maven
com.liuxiang
velocity-web
pom.xml 2KB
pom.properties 246B
MANIFEST.MF 106B
classes
ListJspTemplate.vm 2KB
AddTemplate.vm 105B
ActionTemplate.vm 2KB
com
liuxiang
velocity
dao
BaseDao.class 452B
StudentDao.class 3KB
TeacherDao.class 3KB
filter
ActionFilter.class 6KB
action
TeacherAction.class 4KB
StudentAction.class 4KB
BaseAction.class 420B
model
Teacher.class 2KB
Student.class 2KB
annotation
Action.class 427B
Component.class 402B
Autowired.class 403B
framework
Context.class 317B
WebContext.class 400B
ApplicationContext$1.class 878B
WebApplicationContext.class 2KB
ApplicationContext.class 2KB
VelocityGenerator.class 3KB
util
ClassScanner.class 7KB
ClassScanner$1.class 825B
_ClassUtils$1.class 751B
ClassFilter.class 170B
AnnotationUtil.class 2KB
BeanFactory.class 1KB
_ClassUtils.class 6KB
WebUtil.class 2KB
InstanceUtil.class 4KB
ClassUtil.class 890B
ListTableTemplate.vm 515B
ModifyTemplate.vm 176B
macro.vm 944B
.settings
org.eclipse.m2e.core.prefs 90B
org.eclipse.wst.jsdt.ui.superType.name 6B
org.eclipse.wst.common.project.facet.core.xml 252B
org.eclipse.wst.common.component 675B
org.eclipse.wst.jsdt.ui.superType.container 49B
org.eclipse.wst.validation.prefs 50B
.jsdtscope 508B
org.eclipse.jdt.core.prefs 430B
src
test
resources
java
com
liuxiang
velocity
util
test
ClassUtilsTest.java 819B
ApplicationContextTest.java 942B
main
webapp
META-INF
WEB-INF
web.xml 658B
studentModify.jsp 468B
index.jsp 468B
studentAdd.jsp 238B
studentList.jsp 2KB
common.js 2KB
includeJS.jsp 217B
resources
ListJspTemplate.vm 2KB
AddTemplate.vm 105B
ActionTemplate.vm 2KB
ListTableTemplate.vm 515B
ModifyTemplate.vm 176B
macro.vm 944B
java
com
liuxiang
velocity
dao
BaseDao.java 100B
StudentDao.java 2KB
TeacherDao.java 2KB
filter
ActionFilter.java 6KB
action
TeacherAction.java 2KB
BaseAction.java 126B
StudentAction.java 2KB
model
Teacher.java 1KB
Student.java 1KB
annotation
Action.java 325B
Component.java 312B
Autowired.java 313B
framework
Context.java 265B
ApplicationContext.java 1KB
WebContext.java 387B
VelocityGenerator.java 2KB
WebApplicationContext.java 1KB
util
BeanFactory.java 654B
_ClassUtils.java 7KB
AnnotationUtil.java 1KB
InstanceUtil.java 2KB
ClassUtil.java 284B
WebUtil.java 1KB
ClassFilter.java 105B
ClassScanner.java 5KB
.project 1KB
.classpath 1KB
共 91 条
- 1
资源评论
- 十一路客2019-01-30下载了 没有使用
- My012_2018-01-16velocity-web模板工具
nature_fly088
- 粉丝: 46
- 资源: 28
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功