package io.majiang.core;
import io.majiang.annotation.GameService;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class ClassScanner {
private static Map<String, Class<?>> uriMap;
private static FilenameFilter myFilter;
public static void scan(){
Map<String, Class<?>> tmpMap = new HashMap<String, Class<?>>();
Set<Class<?>> classSet;
try {
//设置扫描的报位置
classSet = getClasses("io.majiang");
if (classSet != null) {
for (Class<?> clazz : classSet) {
if (clazz.isAnnotationPresent(GameService.class)) {
GameService annotation = clazz.getAnnotation(GameService.class);
tmpMap.put(annotation.Route(), clazz);
}
}
}
} catch (ClassNotFoundException e) {
System.out.println("ClassUtils 初始化失败");
e.printStackTrace();
} catch (IOException e) {
System.out.println("ClassUtils 初始化失败");
e.printStackTrace();
}
uriMap = Collections.unmodifiableMap(tmpMap);
}
public static Class<?>getUriClass(String uri){
return uriMap.get(uri);
}
public void setClass(String uri,Class<?>uriClass){
uriMap.put(uri, uriClass);
}
/**
* 从包package中获取所有的Class
*
* @param pack
* @return 返回class对象Set
* @throws ClassNotFoundException
* @throws IOException
*/
public static Set<Class<?>> getClasses(String pack)
throws ClassNotFoundException, IOException {
// 第一个class类的集合
Set<Class<?>> classes = new LinkedHashSet<Class<?>>();
// 是否循环迭代
boolean recursive = true;
// 获取包的名字,并进行替换
String packageName = pack;
String packageDirName = packageName.replace('.', '/');
// 定义一个枚举的集合,并进行循环来处理这个目录下的things
Enumeration<URL> dirs;
dirs = Thread.currentThread().getContextClassLoader()
.getResources(packageDirName);
// 循环迭代下去
while (dirs.hasMoreElements()) {
// 获取下一个元素
URL url = dirs.nextElement();
// 得到协议的名称
String protocol = url.getProtocol();
// 如果是以文件的形式保存在文件系统上
if ("file".equals(protocol)) {
System.err.println("file类型的扫描");
// 获取包的物理路径
String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
// 以文件的方式扫描整个包下的文件,并添加到集合中
findAndAddClassesInPackageByFile(packageName, filePath,
recursive, classes);
} else if ("jar".equals(protocol)) {
// 如果是jar包文件
// 定义一个JarFile
System.err.println("jar类型的扫描");
JarFile jar;
// 获取jar
JarURLConnection jarURLConnection = (JarURLConnection) url
.openConnection();
jar = jarURLConnection.getJarFile();
// 从此jar包,得到一个枚举类
Enumeration<JarEntry> entries = jar.entries();
// 同样的进行循环迭代
while (entries.hasMoreElements()) {
// 获取jar里的一个实体,可以是目录,和一些jar包里的其他文件,如META-INF等文件
JarEntry entry = entries.nextElement();
String name = entry.getName();
// 如果是以/开头的
if (name.charAt(0) == '/') {
// 获取后面的字符串
name = name.substring(1);
}
// 如果前半部分和定义的包名相同
if (name.startsWith(packageDirName)) {
int idx = name.lastIndexOf('/');
// 如果以"/"结尾,是一个包
if (idx != -1) {
// 获取包名,把"/"替换成"."
packageName = name.substring(0, idx)
.replace('/', '.');
}
// 如果可以迭代下去,并且是一个包
if ((idx != -1) || recursive) {
// 如果是一个.class文件,而且不是目录
if (name.endsWith(".class")
&& !entry.isDirectory()) {
// 去掉后面的".class",获取真正的类名
String className = name.substring(
packageName.length() + 1,
name.length() - 6);
// 添加到classes
classes.add(Class.forName(packageName + '.'
+ className));
}
}
}
}
}
}
return classes;
}
/**
* 以文件的形式来获取包下的所有Class
*
* @param packageName
* @param packagePath
* @param recursive
* @param classes
* @throws ClassNotFoundException
*/
private static void findAndAddClassesInPackageByFile(String packageName,
String packagePath, final boolean recursive, Set<Class<?>> classes)
throws ClassNotFoundException {
// 获取此包的目录,建立一个File
File dir = new File(packagePath);
// 如果不存在或者,也不是目录就直接返回
if (!dir.exists() || !dir.isDirectory()) {
return;
}
// 如果存在,就获取包下的所有文件,包括目录
File[] dirfiles = dir.listFiles(myFilter);
// 循环所有文件
for (File file : dirfiles) {
// 如果是目录,则继续扫描
if (file.isDirectory()) {
findAndAddClassesInPackageByFile(
packageName + "." + file.getName(),
file.getAbsolutePath(), recursive, classes);
} else {
// 如果是java类文件,去掉后面的.class,只留下类名
String className = file.getName().substring(0,
file.getName().length() - 6);
// 添加到集合中去
classes.add(Thread.currentThread().getContextClassLoader()
.loadClass(packageName + '.' + className));
}
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
mJ李明杰老师的服务器MJServer
共36个文件
java:30个
prefs:2个
classpath:1个
4星 · 超过85%的资源 需积分: 9 415 下载量 114 浏览量
2015-08-31
18:24:07
上传
评论 3
收藏 28KB ZIP 举报
温馨提示
经过长时间的寻找终于找到了明杰老师的MJServer,对于要学习ios的人来说,看到资源下载不来是多么痛苦,何必来个资源分呢,索性我就免费共享了。
资源推荐
资源详情
资源评论
收起资源包目录
mjServer-master.zip (36个子文件)
mjServer-master
Mahjong
.project 559B
src
main
core
io
majiang
filter
Filter.java 350B
IsLoginFilter.java 137B
session
Session.java 122B
RoomManager.java 502B
SessionManager.java 2KB
StandSessionFacade.java 71B
StandardSession.java 850B
Room.java 969B
annotation
Filter.java 329B
GameService.java 324B
base
server
SecureChatClient.java 3KB
SecureChatServerInitializer.java 2KB
SecureChatClientInitializer.java 2KB
SecureChatServerHandler.java 2KB
SecureChatServer.java 3KB
SecureChatClientHandler.java 1KB
core
MjRequest.java 858B
HeartBeat.java 364B
MjDecoder.java 984B
UserChannel.java 412B
ClassScanner.java 6KB
MjEncoder.java 60B
MjResponse.java 1KB
DispatcherHandler.java 897B
exception
FilterException.java 177B
GameServceException.java 180B
java
io
majiang
service
ChatService.java 2KB
EnterRoomService.java 2KB
BaseService.java 370B
entity
User.java 470B
.settings
org.eclipse.m2e.core.prefs 90B
org.eclipse.jdt.core.prefs 243B
pom.xml 3KB
.classpath 971B
.gitignore 21B
共 36 条
- 1
资源评论
- wwww___20102016-07-11好东西啊 值得收藏
- 转向kangqingyu博客2016-05-10不错。不过这个不全呀。。
- culmek2016-04-14这个已经不能用了啊
- ye_xiaozhi2015-10-11找了好久,我的资料里就缺这个文件,很有用的,谢谢楼主分享
- sangbill2015-10-06免费是好,但是这个应该不是李明杰老师里面搭的服务器yuze5122015-10-07http://download.csdn.net/detail/u010712076/9161267不好意思之前上传错了,这是正确的李明杰老师的本地服务器,可以下载,由于内容太大我把里面关系不大的资源删除了部分,同时如果需要学习iOS的话可以进入本人的主页下载视频。
yuze512
- 粉丝: 7
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功