java获取被注解的类_java获取包下被指定注解的类过程解析⽅案⼀: 采⽤reflections 框架(此框架依赖le.guava)
2、项⽬依赖
reflections
0.9.11
21.0
3、实现代码
//⼊参 要扫描的包名
Reflections f = new Reflections("utemand");
//⼊参 ⽬标注解类
Set> set = f.getTypesAnnotatedWith(Cmd.class);
⽅案⼆: 采⽤ClassLoader扫描
1、实现代码
bandty;
import java.io.File;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.JarURLConnection;
import java.URL;
import java.URLDecoder;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Set;
import java.util.jar.JarEntry;手机免费云服务器永久使用
import java.util.jar.JarFile;
public class Scanner {
/**
* 从包package中获取所有的Class
*
* @param packageName
* @return
*/
public Set> getClasses(String packageName) throws Exception {
// 第⼀个class类的集合
//List> classes = new ArrayList>();
Set> classes = new HashSet<>();
// 是否循环迭代
boolean recursive = true;
// 获取包的名字 并进⾏替换
String packageDirName = place('.', '/');
// 定义⼀个枚举的集合 并进⾏循环来处理这个⽬录下的things
Enumeration dirs;
try {
dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName); // 循环迭代下去
while (dirs.hasMoreElements()) {
// 获取下⼀个元素
URL url = Element();
// 得到协议的名称
String protocol = Protocol();
// 如果是以⽂件的形式保存在服务器上
if ("file".equals(protocol)) {
// 获取包的物理路径
String filePath = URLDecoder.File(), "UTF-8");
// 以⽂件的⽅式扫描整个包下的⽂件 并添加到集合中
addClass(classes, filePath, packageName);
} else if ("jar".equals(protocol)) {
casewhen同时满足多条件// 如果是jar包⽂件
python处理json字符串// 定义⼀个JarFile
JarFile jar;
try {
// 获取jar
jar = ((JarURLConnection) url.openConnection()).getJarFile();
// 从此jar包 得到⼀个枚举类
Enumeration entries = ies();
// 同样的进⾏循环迭代
while (entries.hasMoreElements()) {
// 获取jar⾥的⼀个实体 可以是⽬录 和⼀些jar包⾥的其他⽂件 如META-INF等⽂件JarEntry entry = Element();
String name = Name();
// 如果是以/开头的
if (name.charAt(0) == '/') {
// 获取后⾯的字符串
name = name.substring(1);
}
// 如果前半部分和定义的包名相同
java下载过程if (name.startsWith(packageDirName)) {
int idx = name.lastIndexOf('/');
// 如果以"/"结尾 是⼀个包
if (idx != -1) {
// 获取包名 把"/"替换成"."
packageName = name.substring(0, idx).replace('/', '.');
}
// 如果可以迭代下去 并且是⼀个包
if ((idx != -1) || recursive) {
// 如果是⼀个.class⽂件 ⽽且不是⽬录
if (dsWith(".class") && !entry.isDirectory()) {
// 去掉后⾯的".class" 获取真正的类名
String className = name.substring(packageName.length() + 1, name.length() - 6); try {
/
/ 添加到classes
classes.add(Class.forName(packageName + '.' + className));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return classes;
}
public void addClass(Set> classes, String filePath, String packageName) throws Exception {
File[] files = new File(filePath).listFiles(file -> (file.isFile() && Name().endsWith(".class")) || file.isDirectory()); assert files != null;
for (File file : files) {
String fileName = Name();
if (file.isFile()) {
String classsName = fileName.substring(0, fileName.lastIndexOf("."));
if (!packageName.isEmpty()) {
classsName = packageName + "." + classsName;
}
doAddClass(classes, classsName);
}
}
}
public void doAddClass(Set> classes, final String classsName) throws Exception {
ftell函数用法
ClassLoader classLoader = new ClassLoader() {
@Override
public Class> loadClass(String name) throws ClassNotFoundException {
return super.loadClass(name);
}
};
classes.add(classLoader.loadClass(classsName));
}
public Set> getAnnotationClasses(String packageName, Class
//⽤了annotationClass注解的类
Set> controllers = new HashSet<>();
Set> clsList = getClasses(packageName);
if (clsList != null && clsList.size() > 0) {
for (Class> cls : clsList) {
if (Annotation(annotationClass) != null) {
controllers.add(cls);
}
}
}
return controllers;
}
孙侨潞和孙圳是同一个人吗}
2、使⽤:
Set> set = new Scanner().getAnnotationClasses("utemand", Cmd.class);
扩充:现在就可以实现⾃⼰的业务了,⽐如 扫描utemand包下被Cmd注解的类 得到Cmd注解value和被注解类的实例
Map beanContainer = new HashMap<>();
try {
//@1 采⽤reflections 框架(此框架依赖le.guava)
// Reflections f = new Reflections("utemand");
// Set> set = f.getTypesAnnotatedWith(Cmd.class);
//@2 采⽤ClassLoader扫描
Set> set = new Scanner().getAnnotationClasses("utemand", Cmd.class);
for (Class> c : set) {
Object bean = c.newInstance();
Cmd annotation = c.getAnnotation(Cmd.class);
beanContainer.String(annotation.value()), (Command) bean);
}
} catch (Exception e) {
e.printStackTrace();
}
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持聚⽶学院。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论