6.1 注解

  1. 什么是注解,注解作用

        注解就是符合一定格式的语法 @xxxx

        注解作用:

        注释:在阅读程序时清楚----给程序员看的

        注解:给jvm看的,给机器看的

 

        注解在目前而言最主流的应用:代替配置文件

        关于配置文件与注解开发的优缺点:

        注解优点:开发效率高 成本低 

        注解缺点:耦合性大 并且不利于后期维护

package com.xiaowei.zhujie;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//注解的作用就相当于在web.xml中配置url Parteen
@WebServlet("/shate")
public class Demo extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public Demo() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().write("nihao shate");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

}

2.jdk5提供的注解

@Override:告知编译器此方法是覆盖父类的

@Deprecated:标注过时

@SuppressWarnings:压制警告

发现的问题:

不同的注解只能在不同的位置使用(方法上、字段上、类上)

package com.xiaowei.annotation;

import java.util.ArrayList;
import java.util.List;

public class AnnotationDemo {

	public static void main(String[] args) {
		
//		3.压制警告 这个警告可以放到这里 也可以放到方法上
		@SuppressWarnings({ "rawtypes", "unused" })
		List list = new ArrayList();
		
//		2.1 调用过期的方法
		show();
		show("mengfei");

	}
	
//	2.使用deprecated修饰方法 表示这个方法过期
	@Deprecated
	public static void show(){
		System.out.println("我是show方法");
	}
	//方法一定要用static修饰 不然静态不能调用非静态 的方法
	public static void show(String name){
		System.out.println("我是:"+name);
	}
	
	//1.帮助开发人员检查 覆盖父类的方法是否正确
	@Override
	public String toString() {
		return super.toString();
	}	
}

3.自定义注解

1>怎样去编写一个自定义的注解

2>怎样去使用注解

3>怎样去解析注解-----使用反射知识

  1. 编写一个注解

1) 关键字:@interface

2) 注解的属性:

       语法:返回值 名称();

       注意:如果属性的名字是value,并且注解的属性值有一个 那么在使用注解时可以省略value

3) 注解属性类型只能是以下几种

                 1.基本类型

                 2.String

                 3.枚举类型

                 4.注解类型

                 5.Class类型

                 6.以上类型的一维数组类型

4) 介入一个概念:元注解:代表修饰注解的注解,作用:限制定义的注解的特性

@Retention

SOURCE: 注解在源码级别可见

CLASS:注解在字节码文件级别可见

RUNTIME:注解在整个运行阶段都可见

@Target

代表注解修饰的范围:类上使用,方法上使用,字段上使用

FIELD:字段上可用此注解

METHOD:方法上可以用此注解

TYPE:/接口上可以使用此注解

注意:要想解析使用了注解的类 , 那么该注解的Retention必须设置成Runtime

关于注解解析的实质:从注解中解析出属性值

--------------------------------------------------------------------编写一个自定义的注解-----------------------------------------------------------------------

package com.xiaowei.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//4.设置注解使用的范围
@Target({ElementType.TYPE,ElementType.METHOD})

//3.设置注解的可见范围
@Retention(RetentionPolicy.RUNTIME)

//1.使用@interface创建一个注解
public @interface MyAnno {

//	2.注解的属性
	String name();
	
	int age()default 28;
	
	//String value();
	
}

--------------------------------------------------------------------使用注解-----------------------------------------------------------------------

package com.xiaowei.annotation;

public class MyAnnoTest {
	
//	压制所有的警告
	@SuppressWarnings("all")
	@MyAnno(name = "shate")
	public  void show(String str){
		System.out.println("这是show方法");
	}

}

 

--------------------------------------------------------------------解析注解-----使用反射-----------------------------------------------------------------------

package com.xiaowei.annotation;

import java.lang.reflect.Method;

public class MyAnnoParser {

	public static void main(String[] args) throws NoSuchMethodException, SecurityException {
		
//		目标: 
//			1.解析show方法上的@MyAnno
//			2.直接的目的就是 获得show方法上的MyAnno中的参数
		
//		1.获得show方法上的字节码对象
		Class clazz = MyAnnoTest.class;
//		2.通过字节码对象获取show方法
		Method method = clazz.getMethod("show", String.class);
//		3.获得show方法上的MyAnno
		MyAnno annotation = method.getAnnotation(MyAnno.class);
//		4.获取anno上的属性值
		System.out.println(annotation.name());
		System.out.println(annotation.age());
	}
	
}

 

猜你喜欢

转载自blog.csdn.net/qq_43629005/article/details/84788676
6.1