java基础源码 (4)--reflect包-AnnotatedElement接口
接口: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接口的更多相关文章
- java基础源码 (5)--reflect包-AccessibleObject类
学习参考博客:https://blog.csdn.net/benjaminzhang666/article/details/9664585AccessibleObject类基本作用 1.将反射的对象标 ...
- java基础源码 (6)--ArrayListt类
原作出处:https://www.cnblogs.com/leesf456/p/5308358.html 简介: 1.ArrayList是一个数组队列,相当于动态数组.与java中的数组相比,它的容量 ...
- java基础源码 (1)--String类
这个是String类上面的注释,我用谷歌翻译翻译的,虽然有点语法上的问题,但是大概都可以翻译出来 /** * The {@code String} class represents character ...
- java基础源码 (3)--Annotation(注解)
借鉴博客地址:https://www.cnblogs.com/skywang12345/p/3344137.html /** * The common interface extended by al ...
- java基础源码 (2)--StringBuilder类
Serializable(接口): 是一个IO的序列化接口,实现了这个接口,就代表这个类可以序列化或者反序列化,该接口没有方法或者字段,仅用于标识可串行话的语义. Appendable(接口): /* ...
- 自学Java HashMap源码
自学Java HashMap源码 参考:http://zhangshixi.iteye.com/blog/672697 HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提 ...
- java容器源码分析及常见面试题笔记
概览 容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表. List Arraylist: Object数组 ...
- Java集合源码分析(三)LinkedList
LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈.队列和双端队列来使用. LinkedList同样是非线程安全 ...
- Java集合源码学习(一)集合框架概览
>>集合框架 Java集合框架包含了大部分Java开发中用到的数据结构,主要包括List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Array ...
随机推荐
- 【剑指Offer面试编程题】题目1524:复杂链表的复制--九度OJ
题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点). 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第 ...
- python基础面试题1
Python面试重点(基础篇) 注意:只有必答题部分计算分值,补充题不计算分值. 第一部分 必答题(每题2分) 简述列举了解的编程语言及语言间的区别? c语言是编译型语言,运行速度快,但翻译时间长py ...
- tf-idf、朴素贝叶斯的短文本分类简述
朴素贝叶斯分类器(Naïve Bayes classifier)是一种相当简单常见但是又相当有效的分类算法,在监督学习领域有着很重要的应用.朴素贝叶斯是建立在“全概率公式”的基础下的,由已知的尽可能多 ...
- Pytorch【直播】2019 年县域农业大脑AI挑战赛---初级准备(一)切图
比赛地址:https://tianchi.aliyun.com/competition/entrance/231717/introduction 这次比赛给的图非常大5万x5万,在训练之前必须要进行数 ...
- English-Phonics
English-Phonics 1. 音节 1.1 字组 1.2 音节概述及分类 1.3 音节的划分 2. 元音字组的自然发音 2.1 元音字母 2.2 元音字母的长音 2.3 元音字母+r 2.4 ...
- mabatis--使用mapper代理开发dao
1.编写mapper.xml映射文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE m ...
- PHP 符号大全
注解符号: // 单行注解 /* */ 多行注解 引号的使用 ’ ’ 单引号,没有任何意义,不经任何处理直接拿过来; " "双引号,PHP动态处理然后输出,一般 ...
- iOS Burp suite CA证书 HTTPS
设置好burp suite代理后,在浏览器地址输入http://burp/,下载CA证书: 在iOS上下载CA证书,可通过邮件或百度云等一切iOS可以访问证书文件的方法: 点击证书文件iOS提示安装, ...
- P1066 图像过滤
P1066 图像过滤 转跳点:
- Day5-T4
原题目 Describe:最小生成树加权 code: #include<bits/stdc++.h> #define INF 214748364 #define eps 1e-9 #def ...