java扫描指定package注解_java获取包下被指定注解的类

方案一: 采用reflections 框架(此框架依赖com.google.guava)

2、项目依赖

org.reflections

reflections

0.9.11

com.google.guavaguava

21.0

3、实现代码

//入参 要扫描的包名

Reflections f = new Reflections("com.ggband.netty.execute.command");

//入参 目标注解类

Set> set = f.getTypesAnnotatedWith(Cmd.class);

方案二: 采用ClassLoader扫描

1、实现代码

packagecom.ggband.netty;importjava.io.File;importjava.io.IOException;importjava.lang.annotation.Annotation;importjava.net.JarURLConnection;importjava.net.URL;importjava.net.URLDecoder;importjava.util.Enumeration;importjava.util.HashSet;importjava.util.Set;importjava.util.jar.JarEntry;importjava.util.jar.JarFile;public classScanner {/*** 从包package中获取所有的Class

*

*@parampackageName

*@return

*/

public Set> getClasses(String packageName) throwsException {//第一个class类的集合//List> classes = new ArrayList>();

Set> classes = new HashSet<>();//是否循环迭代

boolean recursive = true;//获取包的名字 并进行替换

String packageDirName = packageName.replace('.', '/');//定义一个枚举的集合 并进行循环来处理这个目录下的things

Enumerationdirs;try{

dirs=Thread.currentThread().getContextClassLoader().getResources(packageDirName);//循环迭代下去

while(dirs.hasMoreElements()) {//获取下一个元素

URL url =dirs.nextElement();//得到协议的名称

String protocol =url.getProtocol();//如果是以文件的形式保存在服务器上

if ("file".equals(protocol)) {//获取包的物理路径

String filePath = URLDecoder.decode(url.getFile(), "UTF-8");//以文件的方式扫描整个包下的文件 并添加到集合中

addClass(classes, filePath, packageName);

}else if ("jar".equals(protocol)) {//如果是jar包文件//定义一个JarFile

JarFile jar;try{//获取jar

jar =((JarURLConnection) url.openConnection()).getJarFile();//从此jar包 得到一个枚举类

Enumeration 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);try{//添加到classes

classes.add(Class.forName(packageName + '.' +className));

}catch(ClassNotFoundException e) {

e.printStackTrace();

}

}

}

}

}

}catch(IOException e) {

e.printStackTrace();

}

}

}

}catch(IOException e) {

e.printStackTrace();

}returnclasses;

}public void addClass(Set> classes, String filePath, String packageName) throwsException {

File[] files= new File(filePath).listFiles(file -> (file.isFile() && file.getName().endsWith(".class")) ||file.isDirectory());assert files != null;for(File file : files) {

String fileName=file.getName();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) throwsException {

ClassLoader classLoader= newClassLoader() {

@Overridepublic Class> loadClass(String name) throwsClassNotFoundException {return super.loadClass(name);

}

};

classes.add(classLoader.loadClass(classsName));

}public Set> getAnnotationClasses(String packageName, Class

Set> controllers = new HashSet<>();

Set> clsList =getClasses(packageName);if (clsList != null && clsList.size() > 0) {for (Class>cls : clsList) {if (cls.getAnnotation(annotationClass) != null) {

controllers.add(cls);

}

}

}returncontrollers;

}

}

2、使用:

Set> set = new Scanner().getAnnotationClasses("com.ggband.netty.execute.command", Cmd.class);

扩充:现在就可以实现自己的业务了,比如 扫描com.ggband.netty.execute.command包下被Cmd注解的类 得到Cmd注解value和被注解类的实例

Map beanContainer = new HashMap<>();

try {

//@1 采用reflections 框架(此框架依赖com.google.guava)

// Reflections f = new Reflections("com.ggband.netty.execute.command");

// Set> set = f.getTypesAnnotatedWith(Cmd.class);

//@2 采用ClassLoader扫描

Set> set = new Scanner().getAnnotationClasses("com.ggband.netty.execute.command", Cmd.class);

for (Class> c : set) {

Object bean = c.newInstance();

Cmd annotation = c.getAnnotation(Cmd.class);

beanContainer.put(Arrays.toString(annotation.value()), (Command) bean);

}

} catch (Exception e) {

e.printStackTrace();

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

您将在下一个项目中使用JSF吗?

上周有一篇很棒的stackoverflow博客文章&#xff0c;主题是“ JavaScript框架的残酷生命周期” 。 这篇文章是关于Javascript UI框架&#xff08;angularjs&#xff0c;angular&#xff0c;jquery和react&#xff09;的流行和流行的速度。 这篇文章的关键指标是每月关于框架的问…

java dao层 service层_dao层与service层的区别

service是业务层&#xff0c;dao是数据访问层。这个问题我也曾经考虑过学java的时候&#xff0c;都是在service里直接调用dao&#xff0c;service里面就new一个dao类对象&#xff0c;调用&#xff0c;其他有意义的事没做&#xff0c;也不明白有这个有什么用然后百度了一下我们都…

java heapsort_排序算法笔记:堆排序 HeapSort in java

/*** 堆排序* 简述:* 首先使用建立最大堆的算法建立好最大堆&#xff0c;然后将堆顶元素(最大值)与最后一个值交换&#xff0c;同时使得堆的长度减小1 &#xff0c;调用保持最大堆性质的算法调整&#xff0c;使得堆顶元素成为最大值&#xff0c;此时最后一个元素已被排除在外* …

从Java 10中删除的API

在博客文章“ JDK 10 Release Candidate Phase ”中&#xff0c;我研究了JDK 10可能包含的十二个新功能。 在本文中&#xff0c;我介绍了一些可能会在JDK 10中删除的API&#xff0c;并探讨了一些在JDK 10中建议弃用的API。本文中的信息基于当前版本&#xff08;2018/1 / “ Jav…

使用java自带的日志管理_java日志管理

1.相关概念日志统一框架(日志门面)&#xff1a;apache commons logging、slf4j日志实现框架(实现层)&#xff1a;JDK自带的logging(java.util.logging)、log4j、Java Util Logging、log4j2、logback.(1)JDK自带的logging(java.util.logging)用法&#xff1a;1 importjava.util.…

在会话中使用JWT

在黑客新闻&#xff0c;reddit和博客上&#xff0c;该主题已经讨论了很多次。 共识是–请勿使用JWT&#xff08;用于用户会话&#xff09;。 而且我在很大程度上同意对JWT的典型论点 &#xff0c; 典型的“但我可以使其工作……”的解释以及JWT标准的缺陷的批评 。 。 我不会…

java案例源代码_求java案例源代码 越多越好!

展开全部import java.awt.*;import java.awt.event.*;import java.lang.*;import javax.swing.*;public class Counter extends Frame{//声明三个面板的布局GridLayout gl1,gl2,gl3;Panel p0,p1,p2,p3;JTextField tf1;TextField tf2;Button b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,…

安卓4.4玩java_Android4.4运行过程中闪退java.lang.NoClassDefFoundError

上周五项目测试时发现一个奇怪的Bug&#xff0c;项目中依赖了一个第三方框架&#xff0c;但是在android4.0-4.4.4之间的系统中运行会直接闪退&#xff0c;抛出错误异常为java.lang.NoClassDefFoundError。第一次遇到这样的问题&#xff0c;google了好久找到了以下几个原因&…

java method方法_Java Method.getTypeParameters方法代碼示例

import java.lang.reflect.Method; //導入方法依賴的package包/類private void validateRuleMethod(MethodRuleDefinition, ?> ruleDefinition, Method ruleMethod, RuleSourceValidationProblemCollector problems) {if (Modifier.isPrivate(ruleMethod.getModifiers())) …

update se_Java SE 7 Update 25 –发行说明进行了解释。

update se昨天是CPU日。 Oracle通过6月的Java重要补丁更新发布了Java SE更新25 。 在4月的最后一次重大更新之后&#xff0c;这是最后一次与Oracle其他所有Oracle产品都不适合的Oracle重要补丁更新计划。 从2013年10月开始 &#xff0c;Java安全修补程序将遵循四个年度安全发布…

java scavenge_请概述一下Java中都有哪些垃圾收集器

1、Serial(串行GC)收集器Serial收集器是一个新生代收集器&#xff0c;单线程执行&#xff0c;使用复制算法。它在进行垃圾收集时&#xff0c;必须暂停其他所有的工作线程(用户线程)。是Jvmclient模式下默认的新生代收集器。对于限定单个CPU的环境来说&#xff0c;Serial收集器由…

Java中的异步等待

编写异步代码很困难。 试图了解异步代码应该做什么的难度更大。 承诺是尝试描述延迟执行流程的一种常见方式&#xff1a;首先做一件事&#xff0c;然后再做另一件事&#xff0c;以防万一出错再做其他事情。 在许多语言中&#xff0c;承诺已成为协调异步行为的事实上的方法。 J…

java web ssh启动运行程序_[javaweb开发SSH] myeclipse启动tomcat时的bug

以前用的是myeclipse10.0的版本,我也不知道以前设置了什么,比较正常.由于以前的myeclipse无法装svn,所以装了一个10.7当连接数据库正常时,自然是好的一旦连接数据库不正常了(我故意将数...以前用的是myeclipse10.0的版本, 我也不知道以前设置了什么,比较正常.由于以前的myeclip…

java简单文本编译器_java -简易文本编辑器

import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.io.*;/*** Title:java -简易文本编辑器 ** Description: 08.5.5 简易功能* 1。 打开文件时&#xff0c;无法选择文件&#xff0c;需手动输入* 2. 文件大小超出 多行文本域时&#xff0c;未实现滚动…

阿帕奇光束

Apache Beam是一个开放源代码统一模型&#xff0c;用于定义批处理和流数据并行处理管道。 使用一种开源的Beam SDK&#xff0c;您可以构建一个定义管道的程序。 然后&#xff0c;该管道由Beam支持的分布式处理后端之一执行&#xff0c;这些后端包括Apache Apex &#xff0c; Ap…

java音乐登陆界面_第四篇——Spring音乐登录界面设计及实现(C#)

Spring音乐播放器&#xff0c;我们小组设计其启动时有一个登录界面&#xff0c;用户初次可以注册&#xff0c;输入用户名和密码&#xff0c;点击注册即将输入信息保存到register文本文件中&#xff1b;如果已有用户名&#xff0c;输入用户名和密码&#xff0c;点击登录&#xf…

java中线性结构的例子_java数据结构--线性结构

一、数据结构数据结构由数据和结构两部分组成&#xff0c;就是将数据按照一定的结构组合起来&#xff0c;这样不同的组合方式有不同的效率&#xff0c;可根据需求选择不同的结构应用在相应在场景。数据结构大致分为两类&#xff1a;线性结构(如数组&#xff0c;链表&#xff0c…

过滤序列,惰性序列_Java 8的惰性序列实现

过滤序列,惰性序列我刚刚在GitHub上发布了LazySeq库-这是我最近进行的Java 8实验的结果。 我希望你会喜欢它。 即使您觉得它不是很有用&#xff0c;它仍然是Java 8&#xff08;以及一般而言&#xff09;中的函数式编程的一课。 而且它可能是第一个针对Java 8的社区库&#xff0…

Spring Boot和JSP

本指南展示了如何使用Spring Boot通过JSP创建MVC Web应用程序。 先决条件&#xff1a; Eclipse IDE&#xff08;最新版本&#xff09; Maven的4 Java 1.8 1.创建Maven Web项目 打开eclipse&#xff0c;然后创建一个新的Maven Web项目&#xff0c;并将其命名为SpringBootWe…

java相关技术简介_java技术简介?

java技术简介&#xff1f;关注:186 答案:3 信息版本&#xff1a;手机版 电脑版解决时间 2021-01-17 11:41提问者坟地里唱嗨歌2021-01-17 01:04java技术简介&#xff1f;最佳答案二级知识专家哭嗻説侢見2021-01-17 01:13第一页&#xff1a;什么是Java&#xff1f;Java好象随处…