wildfire chat server source initial submit
This commit is contained in:
@@ -0,0 +1,234 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <[email protected]>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package com.xiaoleilu.loServer.action;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarFile;
|
||||
|
||||
public class ClassUtil {
|
||||
|
||||
/**
|
||||
* 获取同一路径下所有子类或接口实现类
|
||||
*
|
||||
* @param cls
|
||||
* @return
|
||||
* @throws IOException
|
||||
* @throws ClassNotFoundException
|
||||
*/
|
||||
public static List<Class<?>> getAllAssignedClass(Class<?> cls) throws IOException,
|
||||
ClassNotFoundException {
|
||||
List<Class<?>> classes = new ArrayList<Class<?>>();
|
||||
for (Class<?> c : getClasses(cls)) {
|
||||
if (cls.isAssignableFrom(c) && !cls.equals(c)) {
|
||||
classes.add(c);
|
||||
}
|
||||
}
|
||||
return classes;
|
||||
}
|
||||
|
||||
/**
|
||||
* 取得当前类路径下的所有类
|
||||
*
|
||||
* @param cls
|
||||
* @return
|
||||
* @throws IOException
|
||||
* @throws ClassNotFoundException
|
||||
*/
|
||||
public static List<Class<?>> getClasses(Class<?> cls) throws IOException,
|
||||
ClassNotFoundException {
|
||||
String pk = cls.getPackage().getName();
|
||||
// String path = pk.replace('.', '/');
|
||||
// ClassLoader classloader = Thread.currentThread().getContextClassLoader();
|
||||
// URL url = classloader.getResource(path);
|
||||
// String type = url.getProtocol();
|
||||
//
|
||||
// System.out.println("the type is " + type);
|
||||
// System.out.println(url.getPath());
|
||||
//
|
||||
// return getClasses(new File(url.getFile()), pk);
|
||||
List<String> classNames = getClassName(pk, true);
|
||||
List<Class<?>> classes = new ArrayList<>();
|
||||
for (String className :
|
||||
classNames) {
|
||||
if (className.endsWith(".class")) {
|
||||
className = className.substring(0, className.length() - 6);
|
||||
className = className.substring(className.lastIndexOf("/")+1, className.length());
|
||||
}
|
||||
|
||||
classes.add(Class.forName(className));
|
||||
}
|
||||
return classes;
|
||||
}
|
||||
|
||||
/**
|
||||
* 迭代查找类
|
||||
*
|
||||
* @param dir
|
||||
* @param pk
|
||||
* @return
|
||||
* @throws ClassNotFoundException
|
||||
*/
|
||||
private static List<Class<?>> getClasses(File dir, String pk) throws ClassNotFoundException {
|
||||
System.out.println(dir.getAbsolutePath());
|
||||
List<Class<?>> classes = new ArrayList<Class<?>>();
|
||||
if (!dir.exists()) {
|
||||
return classes;
|
||||
}
|
||||
for (File f : dir.listFiles()) {
|
||||
if (f.isDirectory()) {
|
||||
classes.addAll(getClasses(f, pk + "." + f.getName()));
|
||||
}
|
||||
String name = f.getName();
|
||||
if (name.endsWith(".class")) {
|
||||
classes.add(Class.forName(pk + "." + name.substring(0, name.length() - 6)));
|
||||
}
|
||||
}
|
||||
return classes;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 获取某包下所有类
|
||||
* @param packageName 包名
|
||||
* @param childPackage 是否遍历子包
|
||||
* @return 类的完整名称
|
||||
*/
|
||||
public static List<String> getClassName(String packageName, boolean childPackage) {
|
||||
List<String> fileNames = null;
|
||||
ClassLoader loader = Thread.currentThread().getContextClassLoader();
|
||||
String packagePath = packageName.replace(".", "/");
|
||||
URL url = loader.getResource(packagePath);
|
||||
if (url != null) {
|
||||
String type = url.getProtocol();
|
||||
if (type.equals("file")) {
|
||||
fileNames = getClassNameByFile(url.getPath(), null, childPackage);
|
||||
} else if (type.equals("jar")) {
|
||||
fileNames = getClassNameByJar(url.getPath(), childPackage);
|
||||
}
|
||||
} else {
|
||||
fileNames = getClassNameByJars(((URLClassLoader) loader).getURLs(), packagePath, childPackage);
|
||||
}
|
||||
return fileNames;
|
||||
}
|
||||
|
||||
/**
|
||||
* 从项目文件获取某包下所有类
|
||||
* @param filePath 文件路径
|
||||
* @param className 类名集合
|
||||
* @param childPackage 是否遍历子包
|
||||
* @return 类的完整名称
|
||||
*/
|
||||
private static List<String> getClassNameByFile(String filePath, List<String> className, boolean childPackage) {
|
||||
List<String> myClassName = new ArrayList<String>();
|
||||
File file = new File(filePath);
|
||||
File[] childFiles = file.listFiles();
|
||||
for (File childFile : childFiles) {
|
||||
if (childFile.isDirectory()) {
|
||||
if (childPackage) {
|
||||
myClassName.addAll(getClassNameByFile(childFile.getPath(), myClassName, childPackage));
|
||||
}
|
||||
} else {
|
||||
String childFilePath = childFile.getPath();
|
||||
if (childFilePath.endsWith(".class")) {
|
||||
if (childFilePath.indexOf("\\classes") >= 0 || childFilePath.indexOf("/classes") >= 0) {
|
||||
int start = childFilePath.indexOf("\\classes");
|
||||
if (start == -1) {
|
||||
start = childFilePath.indexOf("/classes");
|
||||
}
|
||||
childFilePath = childFilePath.substring(start + 9, childFilePath.lastIndexOf("."));
|
||||
}
|
||||
childFilePath = childFilePath.replace("\\", ".");
|
||||
childFilePath = childFilePath.replace("/", ".");
|
||||
myClassName.add(childFilePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return myClassName;
|
||||
}
|
||||
|
||||
/**
|
||||
* 从jar获取某包下所有类
|
||||
* @param jarPath jar文件路径
|
||||
* @param childPackage 是否遍历子包
|
||||
* @return 类的完整名称
|
||||
*/
|
||||
private static List<String> getClassNameByJar(String jarPath, boolean childPackage) {
|
||||
List<String> myClassName = new ArrayList<String>();
|
||||
String[] jarInfo = jarPath.split("!");
|
||||
String jarFilePath = jarInfo[0].substring(jarInfo[0].indexOf("/"));
|
||||
String packagePath = jarInfo[1].substring(1);
|
||||
try {
|
||||
JarFile jarFile = new JarFile(jarFilePath);
|
||||
Enumeration<JarEntry> entrys = jarFile.entries();
|
||||
while (entrys.hasMoreElements()) {
|
||||
JarEntry jarEntry = entrys.nextElement();
|
||||
String entryName = jarEntry.getName();
|
||||
|
||||
if (entryName.endsWith(".class")) {
|
||||
if (childPackage) {
|
||||
if (entryName.startsWith(packagePath)) {
|
||||
entryName = entryName.replace("/", ".").substring(0, entryName.lastIndexOf("."));
|
||||
myClassName.add(entryName);
|
||||
}
|
||||
} else {
|
||||
int index = entryName.lastIndexOf("/");
|
||||
String myPackagePath;
|
||||
if (index != -1) {
|
||||
myPackagePath = entryName.substring(0, index);
|
||||
} else {
|
||||
myPackagePath = entryName;
|
||||
}
|
||||
if (myPackagePath.equals(packagePath)) {
|
||||
entryName = entryName.replace("/", ".").substring(0, entryName.lastIndexOf("."));
|
||||
myClassName.add(entryName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return myClassName;
|
||||
}
|
||||
|
||||
/**
|
||||
* 从所有jar中搜索该包,并获取该包下所有类
|
||||
* @param urls URL集合
|
||||
* @param packagePath 包路径
|
||||
* @param childPackage 是否遍历子包
|
||||
* @return 类的完整名称
|
||||
*/
|
||||
private static List<String> getClassNameByJars(URL[] urls, String packagePath, boolean childPackage) {
|
||||
List<String> myClassName = new ArrayList<String>();
|
||||
if (urls != null) {
|
||||
for (int i = 0; i < urls.length; i++) {
|
||||
URL url = urls[i];
|
||||
String urlPath = url.getPath();
|
||||
// 不必搜索classes文件夹
|
||||
if (urlPath.endsWith("classes/")) {
|
||||
continue;
|
||||
}
|
||||
String jarPath = urlPath + "!/" + packagePath;
|
||||
myClassName.addAll(getClassNameByJar(jarPath, childPackage));
|
||||
}
|
||||
}
|
||||
return myClassName;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user