JAVA注解
- java注解是十分重要的基础内容,现在出现并且市面上主流的框架已经离不开注解的使用,包括Servlet从java8开始便可以通过注解来注册,而不需要再在web.xml文件中声明
- 什么是注解呢?官方的可以移步百度,我这里仅讲解我的认知。
(1)注解可以理解为一种声明,这种声明的标识可以替代Spring里面的bean 可以替代web.xml 里面的组件,让系统进行识别。
(2)注解这套机制也相当于贴标签,但是这只标签只给我们程序员或者代码观看,不提供给他人展览。
(3)当贴好了标签之后,我们选择性在生成的Document文档的时候供程序员浏览、也可以根据标签标识设置我们所需要的内容。例如希望在一个javabean中设置一个主属性,便可以通过标签(注解)标识出来(jdbc框架中可以使用到)。
(4)其实系统中也有许多注解比如常用的 @Override,这个便是系统告诉你说下面这个方法是从父类/接口 继承过来的方法,所以说注解我们离不开、也无处不在- 我在本文中主要讲解的是元注解的应用,然后会在下一篇博客书写如何结合java反射的内容来实现一个简单的功能模块的开发,如果需要学习java反射可以移步(https://blog.csdn.net/weixin_44929998/article/details/100146865)进行学习
1 系统中的注解
1.1 系统中的三大注解
1.1.1 @Override注解
说明:
@Override注解主要用于继承或重写方法,例如在javaBean中我们会重写ToString方法,在继承了某个接口我们会进行实现
演示代码:
/**
* TestDemo接口
**/
public interface TestDemo {
public void show();
}
/**
* TestDemo02 java类
**/
public class TestDemo02 {
public void isFather() {
System.out.println("I am father");
}
}
/**
* TestMain测试类,继承TestDemo02类,实现TestDemo接口
**/
public class TestMain extends TestDemo02 implements TestDemo{
@Override
public void show() {
// TODO Auto-generated method stub
}
//此处@Override不加不会报错但是方法就是新的方法不是继承父类的方法,加之后会检查方法名等
@Override
public void isFather() {
}
}
1.1.2 @Deprecated 注解
说明:
@Deprecated 主要是描述过时的方法等,比如我们使用Date类的方法时,会看到许多画了斜杠横线的方法,这些方法就是使用了@Deprecated注解,通常我们会重写此类方法
演示代码:
/**
* 此处放到csdn博客凸显不来效果,我会把效果图发出来在下文
*/
public class TestMain {
public static void main(String[] args) {
Date date = new Date();
date.getHours(); //废弃的方法
TestMain testMain = new TestMain();
testMain.show(); //自己使用注解废弃的方法
testMain.show("");
}
@Deprecated
public void show() {
System.out.println("显示什么呢?");
}
public void show(String str) {
System.out.println(str);
}
public void show(char c) {
System.out.println(c);
}
}
结果:
1.1.3 @SuppressWarnings 注解
说明:
@SuppressWarnings 本意是“压缩警告”,也就是说我们不想一些警告信息出现,那么此时就可以用到此注解进行告知编译器
演示代码:
public class TestMain {
@SuppressWarnings("all")
public void show01() {
String str;
}
public void show02() {
String str;
}
}
效果图:
2 ‘注解类’以及‘元注解’
2.1 注解类
- 注解类通过new一个Annotation便可以得到一个注解类
- 注解类其实就是一个接口,并且这个接口自动继承了Annotation这个接口
- 注解类中支持的属性类型
(1) 基本数据类型(byte, short,int, long,char, boolean, float, double等);
(2)String;
(3)Class类;
(4)枚举(enum);
(5)其他的注解;
(6)以上类型的数组;- 注解类的属性并非常见的class类的属性,而是将‘无参数的成员方法’称之为属性,不理解可以直接看下列示例代码
示例代码:
//1. 枚举类创建
public enum Type {
boy,
girl,
old_boy,
younger_girl
}
//2. 注解类创建
public @interface Test {
int a();
char b();
String c();
Class e();
Type f();
String[] d();
}
//3. java类创建,并使用Test注解类标识,此时切记要将全部定义的元素写上去。因为d是数组,注意格式
@Test(a = 12,b='B',c = "C",d= {"d1","d2"}, e = Person.class,f = Type.girl)
public class Person {
}
2.2 元注解
1.我们知道java程序运行分为三步,第一为源代码阶段(Resource),第二位字节码阶段(.class文件),第三个为运行阶段(RunTime)。而java代码又有其类、属性、方法等部分。
2.注解既然是为代码的不同成分加标签,但是为了区分各个注解的作用域(类、方法、属性)、作用时间(1.所说内容)、以及其他特性,我们在注解上面添加一层注解,这个就是所谓的元注解
2.2.1 @target 元注解
- target元注解标主要用来标识此注解的作用域(类、接口、类中的属性、方法等)
- target元注解中各项的含义
(1)ElementType.TYPE //表示作用域为 类、 接口、 注解等上
(2)ElementType.FEILD //表示作用域为 类中的属性
(3)ElementType.METHOD //表示作用域为类中的成员方法
(4)ElementType.CONSTRUCTOR //表示作用域为类中的构造方法
(5)ElementType.PARAMETER //表示作用域为方法的参数
(6)ElementType.LOCAL_VARIABLE //表示作用域为本地局部变量上面
(7)ElementType.ANNOTATION_TYPE //表示作用域在注解类型上面
(8)ElementType.PACKAGE //表示作用域在包名上面
(9)ElementType.TYPE_PARAMETER,ElementType.TYPE_USE //1.8新特性,网上众说纷纭,我这里还不是很懂,不做解释了- target元注解可以规定作用在多个域上面,但是个人建议一个注解只有一个作用域;最常用的是前三个
示例代码:
/**
* 当注解希望被注释在类上面,而且仅仅在此位置可以按照如下书写--个人推荐如此
**/
@Target(ElementType.TYPE)
public @interface Test {
int a ();
char b ();
String c();
Class e();
Type f();
String[] d();
}
/**
* 当注解需要有多个作用域的时候,可以按照如下书写,个人不是很推荐
**/
@Target({ElementType.FIELD,ElementType.CONSTRUCTOR,ElementType.TYPE,ElementType.METHOD})
public @interface Test {
int a ();
char b ();
String c();
Class e();
Type f();
String[] d();
}
2.2.2 @Retention 元注解
- @Retention注解主要标识自定义注解的作用时间
- java代码过程应该有三个时态,源代码(.java)-source时态,编译后字节码(.class)-Class时态,加载到jvm内存-Runtime运行时态那么也就对应Retention作用的范围不一样
(1)RetentionPolicy.SOURCE //源代码阶段
(2)RetentionPolicy.CLASS //字节码阶段
(3)RetentionPolicy.RUNTIME //运行阶段- 我们最为常用的是注解第三个运行阶段,但是切记只能表示一个状态
示例代码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
int a ();
char b ();
String c();
Class e();
Type f();
String[] d();
}
2.2.3 @Inherited 元注解
- @Inherited的意思是当一个类被此元注解修饰后的注解注解了,那么这个类的子类也会拥有此注解;
示例代码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited //注意观察这
public @interface Test {
int a ();
char b ();
String c();
Class e();
Type f();
String[] d();
}
@Test(a = 12,b='B',c = "C",d= {"d1","d2"},f = Type.girl, e = Person.class)
public class Person {
}
/**
* 此时son类已经拥有了Test注解,当然也可以再次注解进行覆盖
**/
public class son extend Person{
}
2.2.4 @Documented 元注解
- @Documented注解是最为简单的注解,此注解含义是在生成 javadoc文档的时候将注解包含进去,当然不写便不会包含进去
示例代码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented //注意观察这
public @interface Test {
int a ();
char b ();
String c();
Class e();
Type f();
String[] d();
}
3. 小结
- 注解其实就是进行贴标签作用,而元注解就是给注解进行行为限制
- 注解在生成文档方面有一定作用
- 注解集合java反射知识点可以做出很美妙的东西,许多框架都离不开此两者的结合使用,如果你还不了解java反射,请移步: https://blog.csdn.net/weixin_44929998/article/details/100146865 进行查看,或者点击 java反射
- 本文仅作为注解的基础了解,如何结合java注解请关注本人下一篇文章(我在写这个博客的时候还没出来)
- 本人其实是个弱鸡,如果有什么不对或者什么好的建议,希望大家给我斧正斧正,提前谢谢各位。