接口:AnnotatedElement

 * Represents an annotated element of the program currently running in this
* VM. This interface allows annotations to be read reflectively. All
* annotations returned by methods in this interface are immutable and
* serializable. The arrays returned by methods of this interface may be modified
* by callers without affecting the arrays returned to other callers.
  表示当前在此虚拟机中运行的程序的注释元素,该界面允许反射读取注释,通过该接口方法返回的所有注释
都是不可变并且可序列化。通过此接口的方法返回的陈列可以由呼叫着,而不会影响其他调用者返回阵列进行修改。
*/
public interface AnnotatedElement {
/**
* Returns true if an annotation for the specified type
* is <em>present</em> on this element, else false. This method
* is designed primarily for convenient access to marker annotations.
    如果此元素上存在指定类型的注释,则返回true,否则返回false,该方法主要用于方便
    访问标记注释
*/
default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {
return getAnnotation(annotationClass) != null;
} /**
* Returns this element's annotation for the specified type if
* such an annotation is <em>present</em>, else null.
  如果这样的注解存在,就返回该注解,否则返回Null*/
<T extends Annotation> T getAnnotation(Class<T> annotationClass); /**
* Returns annotations that are <em>present</em> on this element.
*返回此元素上存在的注解
*/
Annotation[] getAnnotations(); /**
* Returns annotations that are <em>associated</em> with this element.
返回与此注解相关联的注解*/
default <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass) {
   //默认的调用getDeclaredAnnotationsByte传入annotationClass作为参数
T[] result = getDeclaredAnnotationsByType(annotationClass);
    //如果返回的数组长度大于零,则返回数组,
    //如果返回的数组是零长度而这个AnnotationElement是一个类,
    //并且参数类型是可继承的注解类型,并且该AnnotatedElement的AnnotatedElement是非空的
    //则返回结果是在父类上调用getAnnotationsByType的结果,具有annotationClass作为论证
    //否则返回零长度的数组
if (result.length == 0 && // Neither directly nor indirectly present
this instanceof Class && // the element is a class
AnnotationType.getInstance(annotationClass).isInherited()) { // Inheritable
Class<?> superClass = ((Class<?>) this).getSuperclass();
if (superClass != null) {
// Determine if the annotation is associated with the
// superclass
result = superClass.getAnnotationsByType(annotationClass);
}
} return result;
} /**
* Returns this element's annotation for the specified type if
* such an annotation is <em>directly present</em>, else null.
    如果这样的注解直接存在,则返回指定类型的元素注解,否则返回null,此方法忽略继承的注解*/
default <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass) {
Objects.requireNonNull(annotationClass);
// Loop over all directly-present annotations looking for a matching one
for (Annotation annotation : getDeclaredAnnotations()) {
if (annotationClass.equals(annotation.annotationType())) {
//更强大,在编译期间进行动态转换
return annotationClass.cast(annotation);
}
}
return null;
} default <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass) {
Objects.requireNonNull(annotationClass);
return AnnotationSupport.
getDirectlyAndIndirectlyPresent(Arrays.stream(getDeclaredAnnotations()).
collect(Collectors.toMap(Annotation::annotationType,
Function.identity(),
((first,second) -> first),
LinkedHashMap::new)),
annotationClass);
} /**
* Returns annotations that are <em>directly present</em> on this element.
* This method ignores inherited annotations.
   返回直接存在于此元素上的注释*/
Annotation[] getDeclaredAnnotations();
}

isAnnotationPresent方法的示例:

@Retention(RetentionPolicy.RUNTIME)
@interface Cus{
public String name();
public String value();
} @Cus(name = "SampleClass",value = "Sample Class Annotation")
class SampClass{
private String sampleFileld;
@Cus(name = "sampleMethod",value = "sample Method Annotation")
public String sampleMethod(){
return "sample";
}
public String getSampleFileld(){
return sampleFileld;
}
public void setSampleFileld(String sa){
this.sampleFileld=sa;
}
} public class AccessibleObjectDemo {
public static void main(String [] args) throws NoSuchMethodException {
AccessibleObject sampleMethod = SampClass.class.getMethod("sampleMethod");
System.out.println("sampleMethod.isAnnotationPresent:"+sampleMethod.isAnnotationPresent(Cus.class));
//输出结果:sampleMethod.isAnnotationPresent:true
}
}
getAnnotations()示例:
@Retention(RetentionPolicy.RUNTIME)
@interface Tt{
public String name();
public String value();
} @Tt(name = "SampleClass",value = "Sample Class Annotation")
class SampClass2{
private String sampleFileld;
@Tt(name = "sampleMethod",value = "sample Method Annotation")
public String sampleMethod(){
return "sample";
}
public String getSampleFileld(){
return sampleFileld;
}
public void setSampleFileld(String sa){
this.sampleFileld=sa;
}
} public class AccessibleObjectDemo2 {
public static void main(String [] args) throws NoSuchMethodException {
AccessibleObject sampleMethod = SampClass2.class.getMethod("sampleMethod");
Annotation[] annotations = sampleMethod.getAnnotations(); for(int i=0;i<annotations.length;i++){
if(annotations[i] instanceof Tt){
Tt cus2= (Tt) annotations[i];
System.out.println(cus2.name());
System.out.println(cus2.value());
/*
输出结果:
sampleMethod
sample Method Annotation
* */
}
}
}
}

java基础源码 (4)--reflect包-AnnotatedElement接口的更多相关文章

  1. java基础源码 (5)--reflect包-AccessibleObject类

    学习参考博客:https://blog.csdn.net/benjaminzhang666/article/details/9664585AccessibleObject类基本作用 1.将反射的对象标 ...

  2. java基础源码 (6)--ArrayListt类

    原作出处:https://www.cnblogs.com/leesf456/p/5308358.html 简介: 1.ArrayList是一个数组队列,相当于动态数组.与java中的数组相比,它的容量 ...

  3. java基础源码 (1)--String类

    这个是String类上面的注释,我用谷歌翻译翻译的,虽然有点语法上的问题,但是大概都可以翻译出来 /** * The {@code String} class represents character ...

  4. java基础源码 (3)--Annotation(注解)

    借鉴博客地址:https://www.cnblogs.com/skywang12345/p/3344137.html /** * The common interface extended by al ...

  5. java基础源码 (2)--StringBuilder类

    Serializable(接口): 是一个IO的序列化接口,实现了这个接口,就代表这个类可以序列化或者反序列化,该接口没有方法或者字段,仅用于标识可串行话的语义. Appendable(接口): /* ...

  6. 自学Java HashMap源码

    自学Java HashMap源码 参考:http://zhangshixi.iteye.com/blog/672697 HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提 ...

  7. java容器源码分析及常见面试题笔记

      概览 容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表. List Arraylist: Object数组 ...

  8. Java集合源码分析(三)LinkedList

    LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈.队列和双端队列来使用. LinkedList同样是非线程安全 ...

  9. Java集合源码学习(一)集合框架概览

    >>集合框架 Java集合框架包含了大部分Java开发中用到的数据结构,主要包括List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Array ...

随机推荐

  1. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:强制元素隐藏

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. linux打包解压包(.tar .gz .tar.gz .zip)

    01-.tar格式 解包:[*******]$ tar xvf FileName.tar 打包:[*******]$ tar cvf FileName.tar DirName(注:tar是打包,不是压 ...

  3. Centos7 下vmware NAT模式配置网络连接与DNS

    NAT模式配置网络 1.首先查看NAT模式下的网络 从这边可以知道我的vmware下的nat模式的网络是192.168.109.*网段 上图这个网段也可以修改为别的网段 2.NAT模式下的网关 3.配 ...

  4. Java对比两个数据库中的表和字段,写个冷门的东西

    Java对比两个数据库中的表和字段,写个冷门的东西 转载的 来源网络 目前所在的项目组距离下个版本上线已经很近了,就面临了一个问题:开发人员在开发库上根据需要增加数据表.数据字段.或者变更了字段类型或 ...

  5. docker-compose 快速部署Prometheus,监控docker 容器, 宿主机,ceph -- cluster集群

    话不多说上菜: 现在环境是这样: ceph 4台: 192.168.100.21  ceph-node1 192.168.100.22  ceph-node2 192.168.100.23  ceph ...

  6. 如何让Dev支持c++11特性

    1.点击工具选择编译选项 2.在编译时加入以下命令点击之后再将-std=c++11加入,点击确定就ok了

  7. 爬虫(十六):Scrapy框架(三) Spider Middleware、Item Pipeline

    1. Spider Middleware Spider Middleware是介入到Scrapy的Spider处理机制的钩子框架. 当Downloader生成Response之后,Response会被 ...

  8. 026、MySQL取字符串左边,取字符串右边,取字符串中间,取文本开始位置

    #取文本左边 ); #田 ); #田攀 ); #田攀5 #取文本右边 ); # ); # ); #攀52 #取文本中间 '); #田攀 '); #攀5 #从字符串s中获取s1的开始位置 不忘初心,如果 ...

  9. 012、MySQL取本月第一天日期,取每个月的第一天日期

    #取本月第一天 SELECT DATE_ADD( curdate( ), INTERVAL DAY ); #取往后几个月的第一天 , INTERVAL MONTH ); , INTERVAL MONT ...

  10. ej3-1优先使用静态工厂方法而非构造函数来创建对象

    背景 很早之前就已经自己翻译了,先简单的贴出来,并做一下回顾. 条款1 优先使用静态工厂方法而非构造函数来创建对象 允许客户端创建一个实例的传统方法是:提供一个公共构造函数:有另外一个必须成为每个程序 ...