JavaSE笔记-注释
Annotation
Annotation是一个接口,可以把Annotation当成一个修饰符
Annotation的定义
注解通过@interface定义
public @interface TestAnnotation {
//Annotation的成员变量通过无形参的方法形式声明,方法名和返回值表示成员变量的名字和类型
String name();
//默认值通过default指定
int age() default 32;
}
提取Annotation的信息
提取Annotation的信息需要用到java.lang.reflect的反射API,并且在定义Annotation的@Retention要指定为RetentionPolicy.RUNTIME
5个基本的Annotation
@Override->强制重写父类的方法,避免出现父类方法名和子类方法名不一致的错误
@Deprecated->标记方法已过时
@Suppress Warnings->取消编译器的警告
@Safe Varages->解决“堆污染”
public static void main(String[] args) {
List list = new ArrayList();
list.add(20);
//当把一个不带泛型的对象赋值给一个带泛型的变量,引发的错误叫“堆污染”,发生ClassCastException
List<String> ls = list;
System.out.println(ls.get(0));
}
@FunctionalInterface->标记接口是一个函数式接口
@FunctionalInterface
//函数式接口中有一个抽象方法,多个静态方法和默认方法,如果试图声明第二个抽象方法,会报错
public interface Test {
void a();
default void b(){
System.out.println("b");
}
static void c() {
System.out.println("c");
}
}
6个Meta Annotation
@Retention
Retention用于修饰Annotation,作用是指定修饰的Annotation可以保留多长时间
//Retention有一个RetentionPolicy的成员变量value
// value的取值:RetentionPolicy.RUNTIME,RetentionPolicy.CLASS,RetentionPolicy.SOURCE
//RUNTIME、CLASS会将Annotation记录在class文件中,SOURCE会直接丢弃Annotation
//RUNTIME可以通过反射获取Annotation的信息,class不可以
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
}
@Target
Target用于修饰Annotation,作用是指定Annotation可以修饰那些程序单元
- ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
- ElementType.CONSTRUCTOR 可以给构造方法进行注解
- ElementType.FIELD 可以给属性进行注解
- ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
- ElementType.METHOD 可以给方法进行注解
- ElementType.PACKAGE 可以给一个包进行注解
- ElementType.PARAMETER 可以给一个方法内的参数进行注解
- ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
//Retention有一个ElementType的成员变量value
@Target(ElementType.FIELD)
public @interface Test {
}
class A{
@Test
private int a;
}
@Documented
Documented用于修饰Annotation,作用是指定被Documented修饰的Annotation类会被javadoc提取成文档
@Inherited
Inherited用于修饰Annotation,作用是指定被修饰的Annotation具有继承性
@Inherited
//注意这要写上RUNTIME,不然下边的isAnnotationPresent()不能通过反射拿到Annotation信息
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
} @Test
class A{
}
//B类并未使用@Test注解,但是B类也被@Test修饰了
class B extends A{
public static void main(String[] args){
System.out.println(B.class.isAnnotationPresent(Test.class));
}
}
@Repeatable
Repeatable用于修饰Annotation,可以使用多个相同名字的注解
//在没有使用Repeatable前,我们要给某个程序元素注解多个相同名字的注解时,必须要有一个容器注解
@Retention(RetentionPolicy.RUNTIME)
public @interface Result{
String name();
int age();
}
@Retention(RetentionPolicy.RUNTIME)
@interface Results{
Result[] value();
}
@Results({@Result(name="张三",age=16),
@Result(name="李四",age=20)}
)
class Person{
public static void main(String[] args){
Class<Person> pClass = Person.class;
Results results = pClass.getDeclaredAnnotation(Results.class);
System.out.println(results);
}
}
//使用Repeatable注解修改
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Results.class)
public @interface Result{
String name();
int age();
}
@Retention(RetentionPolicy.RUNTIME)
@interface Results{
Result[] value();
}
@Result(name="张三",age=16)
@Result(name="李四",age=20)
class Person{
public static void main(String[] args){
Class<Person> pClass = Person.class;
Results results = pClass.getDeclaredAnnotation(Results.class);
System.out.println(results);
}
}
实际上任然需要容器注解,只是红色的部分写法发生了变化
ElemType
Java 8 中 ElementType 增加了 ElementType.TYPE_USE 和 ElementType.TYPE_PARAMETER。它们都可以限制哪个类型可以进行注解。能在局部变量、泛型类、父类和接口的实现处使用,甚至能在方法上声明异常的地方使用。
ElementType.TYPE_PARAMETER(Type parameter declaration) 用来标注类型参数。
@Target(ElementType.TYPE_PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface TypeParameterAnnotation { } // 如下是该注解的使用例子
public class TypeParameterClass<@TypeParameterAnnotation T> {
public <@TypeParameterAnnotation U> T foo(T t) {
return null;
}
}
ElementType.TYPE_USE(Use of a type) 能标注任何类型名称,包括上面这个(ElementType.TYPE_PARAMETER的)
ublic class TestTypeUse {
@Target(ElementType.TYPE_USE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TypeUseAnnotation {
}
public static @TypeUseAnnotation class TypeUseClass<@TypeUseAnnotation T> extends @TypeUseAnnotation Object {
public void foo(@TypeUseAnnotation T t) throws @TypeUseAnnotation Exception {
}
}
// 如下注解的使用都是合法的
@SuppressWarnings({ "rawtypes", "unused", "resource" })
public static void main(String[] args) throws Exception {
TypeUseClass<@TypeUseAnnotation String> typeUseClass = new @TypeUseAnnotation TypeUseClass<>();
typeUseClass.foo("");
List<@TypeUseAnnotation Comparable> list1 = new ArrayList<>();
List<? extends Comparable> list2 = new ArrayList<@TypeUseAnnotation Comparable>();
@TypeUseAnnotation String text = (@TypeUseAnnotation String)new Object();
java.util. @TypeUseAnnotation Scanner console = new java.util.@TypeUseAnnotation Scanner(System.in);
}
}
JavaSE笔记-注释的更多相关文章
- JAVASE笔记回顾
第一部分,JAVA基础和面向对象 part01 入门与开发环境搭建 1: 计算机基础知识(了解)(1)计算机(2)计算机硬件(3)计算机软件系统软件:windows,linux,mac应用软件:QQ, ...
- c++语言的学习笔记代码与笔记注释《函数部分》
具体的笔记以注释的形式写在代码内,每个知识点用函数的形式表现. #include <iostream>; #include<cmath> const double PI=3.1 ...
- javaSE 笔记一
java 环境变量配置 步骤: 右键[计算机]图标 –>[属性]–>[高级系统设置]–>[环境变量] 在"系统变量"里找到"Path" ...
- Python核心编程笔记----注释
python 中注释有两种 第一种,文档注释 第二种,一般的注释 下面是例子: class MyClass: '这个是文档注释' def __repr__(self): return "re ...
- QTP自动化测试-笔记 注释、大小写
1 rem 注释内容 2 ' 注释内容 3 快捷键注释-选择代码行-ctrl+M 4 ctrl+shift+同- 取消注释 大小写 qtp:对小写敏感:如果 变量.sheet页是用小写字母命名,则使用 ...
- c++语言的学习笔记代码与笔记注释《面向对象部分》
#include <iostream> /*这是C++中关于面向对象部分的具体笔记和代码 */ //定义类的语法形式; //类中的成员项目之间相互引用,直接使用成员; //类外引用成员的时 ...
- 【Python】2.11学习笔记 注释,print,input,数据类型,标识符
前面学了好多内存什么的知识,没什么用(我有眼不识泰山233 吐槽一句,这课简直就是讲给完全的编程小白听得 就从语言开始写吧(其实好多已经看过了,再来一遍 话说我已经忘了\(Markdown\)怎么写了 ...
- JavaSE笔记-泛型
定义带泛型的类 public class Cat<T> { //可以用T定义实例变量 private T name; //可以用T定义形参 //构造器没有<> public C ...
- JavaSE笔记-异常
Java 异常 Throwable类的体系结构(一些常用的) 异常分类 checked,unchecked 区分:RuntimeException及其子类,Error类及其子类,是unchecked ...
随机推荐
- Jmeter名词注解
取值 ${ip}排除 .*\.js .*\.css .*\.png .*\.gif .*\.msp .*\.js 提取值 (.+?) (.*?)[() 括起来的部分就是需要提取的,对于你要提的内容需要 ...
- 基于 HTML5 结合互联网+的电力接线图
前言 “互联网+”思维让数据的搜集和获取更加便捷,并且随着大数据的深度开发和应用,数据分析预测对于提升用户体验有非常重要的价值,同时也为不同行业.不同领域的合作提供了更广阔的空间.传统的发电企业是一个 ...
- openstack第四章:neutron— 网络服务
第四篇neutron— 网络服务 一.neutron 介绍: Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是 ...
- centos 6.8 nginx+mysql+php
1:查看环境: [root@123 /]# cat /etc/redhat-release CentOS release 6.8 (Final) 2:关掉防火墙 [root@123 /]# chkco ...
- 工具(3): 转换Excel表格到MarkDown:exceltk
源码和下载: 0.1.3 mac: https://github.com/fanfeilong/exceltk/blob/master/pub/exceltk.0.1.3.pkg windows: h ...
- js-高级(原型与原型链、作用域与作用域链、闭包)
## 原型与原型链 * 所有函数都有一个特别的属性: * `prototype` : 显式原型属性 * 所有实例对象都有一个特别的属性: * `__proto__` : 隐式原型属性 * 显式 ...
- ubuntu fiddler firefox http网页不能访问 Secure Connection Failed
1. 给firefox导入fiddler的证书 1) fiddler:tools --> fiddler opthins --> https --> 勾选Capture HTTPS ...
- tomcat知识(一)
1.tomcat配置javaWeb项目常见错误: ①:端口占用 ②:未配置JAVA_HOME环境变量 2.tomcat修改端口号 tomcat安装路径下面找到conf文件夹,修改server.xml文 ...
- Asp.Net core 视图组件ViewComponent
视图组件 ViewComponent 最近用了一下视图组件,还挺方便的,如果遇到公共的部分,可以抽出来,写成视图组件,方便调用 先上图看一下效果:比如首页的4个画红框的地方是4个模块,有些地方可能要重 ...
- poj-2195(最小费用流)
题意:给你一个n*m的地图,H代表这个点有一个房子,m代表这个点是一个人,每次h走一步就花费一,问最小花费使得每个人能进入一个房间 代码:建立一个源点和汇点,每个人和源点相连,每个房子和汇点相连,每个 ...