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

转载于:https://www.cnblogs.com/zhjh256/p/10700952.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java中的反射是指可以在运行时获取或处理任意对象的信息以及操作对象的能力。获取字段上的注解也是反射的一种应用。注解Java中的一种特殊标记,它可以用于给代码添加元数据,比如说用于描述类、方法、参数、变量等信息。注解可以通过反射获取。 要获取字段上的注解,首先需要获取字段对象。可以使用Class类的getField()或getDeclaredField()方法获取字段对象,并且可以通过Field类的getAnnotations()方法获取字段上的所有注解。 getAnnotations()方法返回一个Annotation类型的数组,可以使用foreach循环遍历这个数组,获取注解的信息。每个注解都有自己的类型,所以需要使用getClass()方法获取注解的类型。 下面是示例代码: ``` public class Example { @MyAnnotation(value = "example", count = 2) public String name; public static void main(String[] args) throws NoSuchFieldException { Example example = new Example(); Field field = example.getClass().getField("name"); Annotation[] annotations = field.getAnnotations(); for (Annotation annotation : annotations) { System.out.println(annotation.getClass()); } } } @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) @interface MyAnnotation { String value(); int count() default 1; } ``` 在这个示例代码中,定义了一个MyAnnotation注解,并且使用这个注解标记了Example类中的一个字段。在main()方法中,首先通过getField()方法获取字段对象,然后使用getAnnotations()方法获取字段上的注解。 通过运行代码可以看到,输出了MyAnnotation.class,即成功获取了字段上的注解类型。通过注解类型可以进一步获取注解的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值