Java加深理解有关注释
一、获取应用笔记
常常会遇到这种情况
package Tokyo.Hot;
public class Demo { public static void main(String[] args) { new Thread().stop();
//画一条线。非常明显是过时的方法
}
}
这是过时的方法。这时就要用到注解。告诉编译器,我知道这是过时的,我就喜欢用
@SuppressWarnings("deprecation") deprecation。过时的,背单词 package Tokyo.Hot; public class Demo { @SuppressWarnings("deprecation")
public static void main(String[] args) { new Thread().stop(); }
}
注意:一个注解就是一个类
当你曾经写好了一个类的方法,可是如今不想用了。为了不给用这种方法的人造成困扰,那么就能够在方法上加入一个@Deprecated,这是
一个过时的方法
public class Demo { public static void main(String[] args) { Out();
}
@Deprecated
private static void Out() {
System.out.println("Hello,World!");
}
}
HashSet,须要复写equals方法,可是equals(),參数是Object类型。可是一不小心,写成别的类,这个错误非常不easy找到,那么这时,就须要用到注解@Override,复写
new Thread(new Runnable() {
@Override
public int run() {
}}).start();
注解,相当于一种标记,在包、类、方法、变量、字段等上面加入了这样的标记,告诉编译器。你依照我的标记採取对应的动作
OK。注解的皮毛。已然了解!
二、注解的定义和反射调用
我们想使用某个类,那么就必须先设计写好那个类,注解也是如此,我们想使用某个注解,那么我们也必须提前先设计写好那个注解
1.定义注解类:
public @interface MyTokyo {} 和定义接口的方式是一样的
2.应用了注解的类:
@MyTokyo
class MyClass{},检查这个类上是否有这个注解
3.对"应用注解的类"进行反射
要对一个类进行检查,肯定用到反射
@MyTokyo
public class Demo { public static void main(String[] args) {
Boolean flag = Demo.class.isAnnotationPresent(MyTokyo.class);//检查是否有注解
if(flag){
MyTokyo myTokyo = (MyTokyo) Demo.class.getAnnotation(MyTokyo.class);//得到这个注解对象
System.out.println(myTokyo);
}
}
}
会发现什么也不打印
在自己定义的注解上加入注解,注解的注解->源注解
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTokyo {}
@Retention(RetentionPolicy.RUNTIME)的意义,也就是告诉编译器,将自己定义的注解保留到执行期。由于自己定义的注解可能在编译期,就清除了。javac把源文件编译成class,可能就把源程序的注解就去掉了。还有可能是在类载入器把类载入到内存时,类中的注解是否保留,
也是问题。
特别注意:class文件里的东西。不是字节码,仅仅有类载入器把class文件进行安全检查等一系列的处理后。载入到内存的二进制才是字节码
一个注解的生命周期有三个阶段:
1.java源文件 2.class文件 3.内存中的字节码
所以@Retention就有三种取值:
(RetentionPolicy.SOURCE 源文件阶段)
(RetentionPolicy.CLASS class文件阶段)
(RetentionPolicy.RUNTIME 执行阶段)
而默认值是CLASS阶段
@Override的默认值是(RetentionPolicy.SOURCE 源文件阶段)
@SuppressWarnings的默认值是(RetentionPolicy.SOURCE 源文件阶段)
@Deprecated的默认值 (RetentionPolicy.RUNTIME 执行阶段)
继续,在自己主动注解上再加一个注解@Target
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.METHOD)
public @interface MyTokyo {}
作用:告诉编译器,自己定义的注解仅仅能载入方法上
要想使注解在类和方法都能使用
@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface MyTokyo {}
注意是TYPE,类型。不不过class,接口都能够,所以用TYPE更贴切,而不用class
三、为注解添加属性
注解之所以强大,是由于其的属性
注解非常像接口,而注解的属性就非常像方法
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE}) public @interface MyTokyo {
String color();//注解有个属性color,返回字符串
}
那么主函数就能够是设置属性值
@MyTokyo(color="red") public class Demo { public static void main(String[] args) {
Boolean flag = Demo.class.isAnnotationPresent(MyTokyo.class);//检查是否有注解
if(flag){
MyTokyo myTokyo = (MyTokyo) Demo.class.getAnnotation(MyTokyo.class);//得到这个注解对象
System.out.println(myTokyo.color());
}
}
}
打印red,这就是为注解加入属性,在用的时候,给它设置属性值
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE}) public @interface MyTokyo {
String color() default "blue";//默认是blue
String value();
} @MyTokyo(color="red",value="ax")//属性没有设置默认的时候。全部属性必须都要写 public class Demo {
@MyTokyo("xc")//由于color设置了缺省值,所以能够仅仅写xc代表value的属性值。能够不写value
public static void main(String[] args) {
Boolean flag = Demo.class.isAnnotationPresent(MyTokyo.class);//检查是否有注解
if(flag){
MyTokyo myTokyo = (MyTokyo) Demo.class.getAnnotation(MyTokyo.class);//得到这个注解对象
System.out.println(myTokyo.color());
}
}
}
数组类型的属性
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE}) public @interface MyTokyo {
String color() default "blue";
String value();
int[] arr() default {3,4,5};
}
注意数组的元素假设仅仅有一个的话,arr=1。能够不写大括号
@MyTokyo(color="red",value="ax",arr={1,2,3,4}) public class Demo {
@MyTokyo("xc")
public static void main(String[] args) {
Boolean flag = Demo.class.isAnnotationPresent(MyTokyo.class);
if(flag){
MyTokyo myTokyo = (MyTokyo) Demo.class.getAnnotation(MyTokyo.class);//得到这个注解对象
System.out.println(myTokyo.color());
System.out.println(myTokyo.value());
System.out.println(myTokyo.arr().length);
}
}
}
枚举类型的属性
//定义一个枚举类
public class Week {
private Week(){}
public final static Week SUN = new Week();
public final static Week MON = new Week();
public Week nextDay(){
return this==SUN? MON : null;
}
public String toString(){
return this==MON ? "MON":"SUN";
}
public enum WeekDay{
SUN,MON;
}
}
定义枚举类型的属性
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE}) public @interface MyTokyo {
String color() default "blue";
String value();
Week.WeekDay Day() default Week.WeekDay.SUN;//定义枚举类型的属性
int[] arr() default {3,4,5};
MyAnotaion2 anotaionArr() default @MyAnotaion2("x");
} @MyTokyo(anotaionArr=@MyAnotaion2("wjw"),color="red",value="ax",arr={1,2,3,4}) public class Demo {
@MyTokyo(value="xc",Day=Week.WeekDay.SUN)
public static void main(String[] args) {
Boolean flag = Demo.class.isAnnotationPresent(MyTokyo.class);
if(flag){
MyTokyo myTokyo = (MyTokyo) Demo.class.getAnnotation(MyTokyo.class);//得到这个注解对象 System.out.println(myTokyo.Day().name());
} }
}
注解类型的属性
public @interface MyAnotaion2 {
String value();
} @Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE}) public @interface MyTokyo {
String color() default "blue";
String value();
int[] arr() default {3,4,5};
MyAnotaion2 anotaionArr() default @MyAnotaion2("x");//返回一个MyAnotaion2注解的注解类型属性
}
注解中的注解类型属性
@MyTokyo(anotaionArr=@MyAnotaion2("wjw"),color="red",value="ax",arr={1,2,3,4}) public class Demo {
@MyTokyo("xc")
public static void main(String[] args) {
Boolean flag = Demo.class.isAnnotationPresent(MyTokyo.class);
if(flag){
MyTokyo myTokyo = (MyTokyo) Demo.class.getAnnotation(MyTokyo.class);//得到这个注解对象
System.out.println(myTokyo.color());
System.out.println(myTokyo.value());
System.out.println(myTokyo.arr().length);
System.out.println(myTokyo.anotaionArr().value());
}
}
}
注解的属性返回值还能够是8个基本类类型、class、所有类型的只是阵列
通过查看文件,以便更好地了解的注释。Notes应用也越来越广泛,以后要注意这个应用方面
Java加深理解有关注释的更多相关文章
- 加深理解Java异常概念并熟记5个最常见的运行时异常
加深理解Java异常概念并熟记5个最常见的运行时异常 说明Error与Exception的联系和区别有哪些? 列举最常见的5个运用时异常. 1.Error和Exception的联系和区别: Error ...
- 从Java视角理解CPU缓存(CPU Cache)
从Java视角理解系统结构连载, 关注我的微博(链接)了解最新动态众所周知, CPU是计算机的大脑, 它负责执行程序的指令; 内存负责存数据, 包括程序自身数据. 同样大家都知道, 内存比CPU慢很多 ...
- Effective Java通俗理解(持续更新)
这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...
- Effective Java通俗理解(下)
Effective Java通俗理解(上) 第31条:用实例域代替序数 枚举类型有一个ordinal方法,它范围该常量的序数从0开始,不建议使用这个方法,因为这不能很好地对枚举进行维护,正确应该是利用 ...
- Effective Java通俗理解(上)
这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...
- java全栈day01-03注释、关键字与标识符
通常我们需要在源代码中添加文字用来对进行代码解释说明,但这些文字并不是Java代码的语法,会导致编译出错.这时我们可以使用注释来完成这一事项! 在编译时,编译器会忽略注释的存在,就好像注释内容不存在一 ...
- JAVA 需要理解的重点 一
需要理解的重点内容有: JVM内存管理机制和垃圾回收机制(基本每次面试都会问,一定要搞得透彻) JVM内存调优(了解是怎么回事,一般做项目过程中使用较多) 设计模式(熟悉常见设计模式的应用场景,会画类 ...
- Myeclipse中导入项目后java类中汉字注释出现乱码问题(已解决)
今天重装系统,安装了新的Myeclipse后,导入之前的项目后,,出现了乱码问题.乱码问题主要是java类中的注释,而jsp页面中汉字却完好如初: 右键项目,查看项目的编码格式,UTF-8,把java ...
- [java] 深入理解内部类: inner-classes
[java] 深入理解内部类: inner-classes // */ // ]]> [java] 深入理解内部类: inner-classes Table of Contents 1 简介 ...
随机推荐
- WCF扩展之实现ZeroMQ绑定和protocolBuffer消息编码(三)实现ReplyChannel(2016-03-15 12:35)
这是这个系列的第三篇,其他的文章请点击下列目录 WCF扩展之实现ZeroMQ绑定和protocolBuffer消息编码(一)概要设计 WCF扩展之实现ZeroMQ绑定和protocolBuffer消息 ...
- 重新想象 Windows 8 Store Apps (32) - 加密解密: 非对称算法, 数据转换的辅助类
原文:重新想象 Windows 8 Store Apps (32) - 加密解密: 非对称算法, 数据转换的辅助类 [源码下载] 重新想象 Windows 8 Store Apps (32) - 加密 ...
- 超赞的.NET办公软件库
之前做项目无意中搜到这个站点,一開始以为是国外大牛们的杰作,然后看到联系地址中竟然是四川成都,喔...咱们中国人跟老美.印度人比起来也非常厉害啊. 这个站点一次性提供了word.excel.ppt.p ...
- C#使用SqlBulkCopy将DataTable写入数据库的表中(表不存在则创建新表,数据存在则更新,不存在则插入)
原文:.net使用SqlBulkCopy导入数据(创建新表) .net2.0后ado.net提供了一个快速导入sqlserver的方法sqlbulkcopy.导入效率非常高. 包装了一个简单的sql ...
- 查看linux系统版本号命令
一.查看内核版本号命令: 1) [root@SOR_SYS ~]# cat /proc/version Linux version 2.6.18-238.el5 (mockbuild@x86-012. ...
- Java误区: 静态代码块,当把类将被载入到自己主动运行?
JAVA静态代码块会在类被载入时自己主动运行? 非常多Java开发人员的思想,被这个思想深深的轮奸了n遍,传播这个错误思想的博客,在网上一堆,越来越多的人被轮奸. 如:http://blog.csdn ...
- Objective-C路成魔【2-Objective-C 规划】
郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 编译执行O ...
- Smart Framework
Smart Framework:轻量级 Java Web 框架 发表于2年前(2013-09-01 08:39) 阅读(48569) | 评论(188) 544人收藏此文章, 我要收藏 赞83 阿 ...
- 示例:Netty 处理 TCP数据分包协议
一个.Netty解决TCP协议的数据分包的想法 我们知道通过TCP协议发送接收数据时,假设数据过大.接收到的数据会是分包的.比方: ...
- 【从零学习openCV】IOS7根据人脸检测
前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app.总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...