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()