java反射之获取所有方法及其注解(包括实现的接口上的注解),获取各种标识符备忘
java反射之获取类或接口上的所有方法及其注解(包括实现的接口上的注解)
/**
* 获取类或接口上的所有方法及方法上的注解(包括方法实现上的注解以及接口上的注解),最完整的工具类,没有现成的工具类
*
* @param clz
* @param clzFilter
* 仅返回具有指定类注解的类或接口中的方法,默认不过滤
* @param methodFilter
* 仅返回具有指定方法注解的方法,默认不过滤。 一般使用类或方法即可,没有必要同时两者
* @param includeObject
* 是否包括Object上定义的方法,默认false
* @param println
* 是否打印,默认不打印
* @return
*/
public static Map<Method, Set<String>> getMethodsAndAnnotations(Class clz, Set<Annotation> clzFilter,
Set<Annotation> methodFilter, boolean includeObject, boolean println) {
Map<Method, Set<String>> result = new ConcurrentHashMap<Method, Set<String>>();
Method[] methods = null;
if (includeObject) {
methods = clz.getMethods();
} else {
methods = clz.getDeclaredMethods();
} for (Method method : methods) {
Annotation[] annotations = method.getAnnotations();
result.putIfAbsent(method, new HashSet<>());
for (Annotation annotation : annotations) {
result.get(method).add(annotation.annotationType().getCanonicalName());
}
} Class[] interfaces = clz.getInterfaces();
for (int i = 0; i < interfaces.length; i++) {
for (Method method : interfaces[i].getDeclaredMethods()) {
Annotation[] annotations = method.getAnnotations();
result.putIfAbsent(method, new HashSet<>());
for (Annotation annotation : annotations) {
result.get(method).add(annotation.annotationType().getCanonicalName());
}
}
} if (println) {
System.out.println("=============");
for (Entry<Method, Set<String>> method : result.entrySet()) {
System.out.print(method.getKey().toString() + ":[");
for (String annotation : method.getValue()) {
System.out.print("" + annotation);
}
System.out.println("]");
}
System.out.println("=============");
}
return result;
} public static Map<String, Set<String>> getMethodNameAndAnnotationName(Class clz, Set<Annotation> clzFilter,
Set<Annotation> methodFilter, boolean includeObject, boolean println) {
Map<String, Set<String>> result = new HashMap<>();
Map<Method, Set<String>> tMap = getMethodsAndAnnotations(clz, clzFilter, methodFilter, includeObject, println);
for (Entry<Method, Set<String>> method : tMap.entrySet()) {
result.putIfAbsent(method.getKey().getName(),method.getValue());
result.get(method.getKey().getName()).addAll(method.getValue());
}
return result;
} /**
* 判断某个类的某个方法上是否具有某个注解
* @param clz
* @param method
* @param class1
* @return
*/
public static boolean methodHasAnnotation(Class clz, Method method,Class anno) {
return getMethodNameAndAnnotationName(clz, null, null, false, false).get(method.getName()).contains(anno.getName());
}
public static void main(String[] args) {
TaMethodUtil.getMethodsAndAnnotations(BonusAuditResultServiceImpl.class,null,null,false,true);
// TaMethodUtil.getMethodsAndAnnotations(BonusAuditResultService.class,null,null,false,true);
}
-- 类定义
public class BonusAuditResultServiceImpl extends BusinessService implements BonusAuditResultService, InitializingBean { @Transactional
@Override
public ResultModel<Integer> delete(TaBaseParameter<String> param) {
DBContextHolder.setTargetDataSource("default");
AgencyInfo agencyInfo = new AgencyInfo();
...
}
}
-- 接口定义
public interface BonusAuditResultService {
/**
* 查询分红明细稽核结果
*
* @param dto
* @return
*/
@CloudFunction(desc = "查询分红明细稽核结果")
public ResultModel<List<BonusAuditResult>> queryBonusAuditResult(BonusAuditResultQueryDto dto); @CloudFunction(desc = "XA事务插入")
ResultModel<Integer> insert(TaBaseParameter<AgencyInfo> param);
}
测试结果输出:
=============
public ResultModel auditresult.service.BonusAuditResultServiceImpl.insertNonXATrans():[org.springframework.transaction.annotation.Transactional]
public void auditresult.service.BonusAuditResultServiceImpl.afterPropertiesSet() throws java.lang.Exception:[]
public abstract ResultModel auditresult.api.BonusAuditResultService.insertNShard():[common.annotation.CloudFunction]
public ResultModel auditresult.service.BonusAuditResultServiceImpl.queryCrossShardWithBroadcast():[org.springframework.transaction.annotation.Transactional]
public abstract ResultModel auditresult.api.BonusAuditResultService.insertOneShard():[common.annotation.CloudFunction]
public abstract ResultModel auditresult.api.BonusAuditResultService.insertNonXATrans():[common.annotation.CloudFunction]
public abstract ResultModel auditresult.api.BonusAuditResultService.queryCrossShardWithBroadcast():[common.annotation.CloudFunction]
public ResultModel auditresult.service.BonusAuditResultServiceImpl.insertNShard():[org.springframework.transaction.annotation.Transactional]
public ResultModel auditresult.service.BonusAuditResultServiceImpl.insertOneShard():[org.springframework.transaction.annotation.Transactional]
public ResultModel auditresult.service.BonusAuditResultServiceImpl.insertNonXAAutoTrans():[org.springframework.transaction.annotation.Transactional]
public ResultModel auditresult.service.BonusAuditResultServiceImpl.queryByHint():[org.springframework.transaction.annotation.Transactional]
public abstract ResultModel auditresult.api.BonusAuditResultService.insertNonXAAutoTrans():[common.annotation.CloudFunction]
public abstract ResultModel auditresult.api.BonusAuditResultService.queryByHint():[common.annotation.CloudFunction]
public abstract ResultModel auditresult.api.BonusAuditResultService.queryAllShardAggr():[common.annotation.CloudFunction]
public ResultModel auditresult.service.BonusAuditResultServiceImpl.insertMultiDSWithNShard():[org.springframework.transaction.annotation.Transactional]
public ResultModel auditresult.service.BonusAuditResultServiceImpl.insertMultiDSWithNShardButOneFailed():[org.springframework.transaction.annotation.Transactional]
public ResultModel auditresult.service.BonusAuditResultServiceImpl.queryOneShard():[org.springframework.transaction.annotation.Transactional]
public ResultModel auditresult.service.BonusAuditResultServiceImpl.queryAllShardAggr():[org.springframework.transaction.annotation.Transactional]
public abstract ResultModel auditresult.api.BonusAuditResultService.insertMultiDSWithNShard():[common.annotation.CloudFunction]
public abstract ResultModel auditresult.api.BonusAuditResultService.queryOneShard():[common.annotation.CloudFunction]
public abstract ResultModel auditresult.api.BonusAuditResultService.insertMultiDSWithNShardButOneFailed():[common.annotation.CloudFunction]
public ResultModel auditresult.service.BonusAuditResultServiceImpl.insertAuto():[org.springframework.transaction.annotation.Transactional]
public abstract ResultModel auditresult.api.BonusAuditResultService.delete(TaBaseParameter):[common.annotation.CloudFunction]
public abstract ResultModel auditresult.api.BonusAuditResultService.queryAllShard():[common.annotation.CloudFunction]
public abstract ResultModel auditresult.api.BonusAuditResultService.queryBonusAuditResult(auditresult.dto.BonusAuditResultQueryDto):[common.annotation.CloudFunction]
public ResultModel auditresult.service.BonusAuditResultServiceImpl.insertNonXAABBATrans():[]
public abstract ResultModel auditresult.api.BonusAuditResultService.update(TaBaseParameter):[common.annotation.CloudFunction]
public abstract ResultModel auditresult.api.BonusAuditResultService.insert(TaBaseParameter):[common.annotation.CloudFunction]
public abstract void org.springframework.beans.factory.InitializingBean.afterPropertiesSet() throws java.lang.Exception:[]
public abstract ResultModel auditresult.api.BonusAuditResultService.insertAuto():[common.annotation.CloudFunction]
public ResultModel auditresult.service.BonusAuditResultServiceImpl.queryBonusAuditResult(auditresult.dto.BonusAuditResultQueryDto):[]
public ResultModel auditresult.service.BonusAuditResultServiceImpl.queryAllShard():[org.springframework.transaction.annotation.Transactional]
public ResultModel auditresult.service.BonusAuditResultServiceImpl.delete(TaBaseParameter):[org.springframework.transaction.annotation.Transactional]
public static void auditresult.service.BonusAuditResultServiceImpl.main(java.lang.String[]):[]
public abstract ResultModel auditresult.api.BonusAuditResultService.insertNonXAABBATrans():[common.annotation.CloudFunction]
public ResultModel auditresult.service.BonusAuditResultServiceImpl.update(TaBaseParameter):[org.springframework.transaction.annotation.Transactional]
public ResultModel auditresult.service.BonusAuditResultServiceImpl.insert(TaBaseParameter):[org.springframework.transaction.annotation.Transactional]
=============
method.toString(FQN,全名)和method.getName(短名称)
------------method.getName--------------
run
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
------------method.toString--------------
public void com.westward.Car.run()
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
java反射之获取所有方法及其注解(包括实现的接口上的注解),获取各种标识符备忘的更多相关文章
- ProceedingJoinPoint获取实现类接口上的注解
使用aspectj处理拦截aop,需要获取实现类接口上的注解 public Object around(ProceedingJoinPoint pjp) throws Throwable{ long ...
- Java反射机制的使用方法
Java的反射机制同意你在程序执行的过程中获取类定义的细节.有时候在程序执行的时候才得知要调用哪个方法,这时候反射机制就派上用场了. 获取类 类的获取方法有下面几种: forName().通过Clas ...
- 使用Java反射优化多个方法调用
有段时间没来写博客了,心里一直念叨空了来,今天有时间来记录一篇.前段时间领导提出优化部分系统模块,根据业务要求系统中有很多产品,产品下面有N个指标,一个指标就对应一个方法,所以系统代码中就是这样一个情 ...
- java反射构建对象和方法的反射调用
Java反射技术应用广泛,其能够配置:类的全限定名,方法和参数,完成对象的初始化,设置是反射某些方法.可以增强java的可配置性. 1.1 通过反射构建对象(无参数): 例如我们使用 ReflectS ...
- Java反射【三、方法的反射】
获取一个类下的所有方法 可以获取类类型后,获取到所有方法及相关信息 Method[] ms = c.getMethods(); 获取方法列表(public) Method[] ms = c.getDe ...
- Java反射机制调用私有方法
1.获取目标类: 每个类都有一个class属性,通过实体类的class属性获取: Class clazz = Person.class 通过对象获取. Person p1 = new Person( ...
- AOP之proceedingjoinpoint和joinpoint区别(获取各对象备忘)、动态代理机制及获取原理代理对象、获取Mybatis Mapper接口原始对象
现在AOP的场景越来越多,所以我们有必要理解下和AOP相关的一些概念和机制. import org.aspectj.lang.reflect.SourceLocation; public interf ...
- Java反射机制二 获取方法的返回值或参数的泛型信息
在使用反射机制时,我们经常需要知道方法的参数和返回值类型,很简单 ,下面上示例,示例中的两个方法非常相似 package deadLockThread; import java.lang.refle ...
- Java 反射 方法调用
在使用Java 反射时,对方法的调用,可能碰到最多的问题是,方法的变量如何使用.其实,调用方法的变量全部在参数数组里,不管有多少个参数,你都要把它放在参数数组里,如果是单个非数组参数,则可不使用参数数 ...
随机推荐
- EXSI6怎么设置虚拟机从光驱启动
EXSI在安装完系统以后会默认从磁盘启动,假如需要进入救援模式则需要设置成光驱启动 设置
- HTTP Streaming Architecture HLS 直播点播 HTTP流架构
小结: 1. 3部分 服务器组件 分发组件 客户端组件 https://developer.apple.com/library/archive/documentation/NetworkingInte ...
- Google 内部代码是不支持异常(Excepton)的,C++ 异常的优劣之处有许多讨论(知乎上的讨论)
最近 Google 开源了其内部多年使用的 C++ 代码库 Abseil 作为 C++ 标准库的补充,并会对其进行持续更新,本文对其进行简要介绍. 一句话概括,这个库的特点是用 C++ 11 的代码实 ...
- uboot - the bootloader of linux
[转载]https://blog.csdn.net/kernel_yx/article/details/53045424 最近一段时间一直在做uboot移植相关的工作,需要将uboot-2016-7移 ...
- 读高性能MySql笔记
1.1 MySQL逻辑架构 MySql服务器逻辑架构图 1.连接管理与安全性 每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU核心或者 ...
- c# thread数线程的创建
1. 1 2 3 4 5 6 Thread thread = new Thread(new ThreadStart(getpic)); thread.Start(); private void sho ...
- 820板子安装python
1. 需要安装python, 从 python.org上下载版本,我下的是python3.5,网上搜索到的是python2.7的交叉编译过程 和820的结合下. 需要注意,先把820的环境设置好,就是 ...
- OI养老专题02:约瑟夫问题求幸存者
如题.人数为n(1<=n<=30000),共k(1<=k<=30000)组数据,所报的数m恒为2,只要求输出幸存者. 如果你还不知道什么是约瑟夫问题...——https://w ...
- 记一次Linux服务器因redis漏洞的挖矿病毒入侵
中毒原因,redis bind 0.0.0.0 而且没有密码,和安全意识太薄弱. 所以,redis一定要设密码,改端口,不要用root用户启动,如果业务没有需要,不要bind 0.0.0.0!!!!! ...
- CentOS 7下 部署Redis-cluster集群
redis集群是一个无中心的分布式redis存储架构,可以在多个节点之间进行数据共享,解决了redis高可用.可扩展等问题,redis集群提供了以下两个好处:1)将数据自动切分(split)到多个节点 ...