大家好,我是【1+1=王】, 热爱java的计算机(人工智能)渣硕研究生在读。
如果你也对java、人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!!
Good better best, never let it rest, until good is better, and better best.
往期精彩:
从JDK 5.0开始,Java增加了对元数据(MetaData)的支持,也就是Annotation(注解)。
在Java核心技术第2卷中对注解这样定义:
注解是那些插入到源代码中使用其他工具可以对其进行处理的标签。这些工具可以在源码层次上进行操作,或者可以处理编译器在其中放置了注解的类文件。
注解不会改变程序的编译方式。Java编译器对于包含注解和不包含注解的代码会生成相同的虚拟机指令。
注解其实就是代码里的特殊标记,这些标记可以被读取并执行相应的处理。
注解的一些可能的用法有:
注解是一种趋势,从某种角度来说:框架 = 注解 + 反射 + 设计模式。
/**
* @Description 这是注解的一个实例类
* @author 1+1 =王
* @date 2022/2/22 19:10
* @since version 2.0
*/
public class AnnotationTest {
/**
* @Description 获取指定两个数之和
* @param a
* @param b
* @return 两数之和
*/
public int add(int a, int b){
return a + b;
}
}
JDK中内置的三个基本注解
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.java.code.Servlet<servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
<servlet-mapping>
用注解代替配置文件
package com.java.code.Servlet;
import com.java.code.Jdbc.StudentHomeworkJdbc;
import com.java.code.Model.User;
import javax.jws.WebService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
User user = new User();
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username+password);
if(StudentHomeworkJdbc.selectByUsernameAndPassword(username,password) == 2){
req.getRequestDispatcher("/jsp/login.jsp").forward(req,resp);
}else {
if(StudentHomeworkJdbc.selectByUsernameAndPassword(username,password) == 0){
req.setAttribute("username",username);
req.getRequestDispatcher("/jsp/usualUser.jsp").forward(req,resp);
}else{
req.getRequestDispatcher("/jsp/manager.jsp").forward(req,resp);
}
}
}
}
注解声明为@interface(注:这与interface接口没有任何关系)
public @interface MyAnnotation {
}
内部定义成员通常用value表示
public @interface MyAnnotation {
String value();
}
使用
@MyAnnotation(value = "Hello")
public int add(int a, int b){
return a + b;
}
可以指定成员的默认值,使用default定义
public @interface MyAnnotation {
String value() default "Hello";
}
如果自定义注解没有成员,表明是一个标识;如果注解有成员,在使用注解时必须指定成员的值。
注
元注解用于修饰其他Annotation的定义,它是对现有的注解进行解释说明的注解。
4个元注解:@Retention、@Target、@Documented、@Inherited
进入@Retention注解源码看到它只有一个RetentionPolicy类型的成员。
然后再进入RetentionPolicy中可以看到,他是一个枚举类型,包括三个值(SOURCE、CLASS、RUNTIME)。
三个值分别表示的意义如下:
RetentionPolicy.SOURCE:在源文件中有效,编译器直接丢弃这种策略的注释。
RetentionPolicy.CLASS:在class文件中有效,当运行java程序时,JVM不会保留注释。
RetentionPolicy.RUNTIME:在运行时有效,当运行java程序时,JVM会保留注释。程序可以通过反射获取该注释。
@Target:用于描述注解的适用范围(即可以用在什么地方)
进入@Target注解源码看到它只有一个ElementType数组类型的成员。
ElementType也是一种枚举类型:
public enum ElementType {
/** Class, interface (including annotation type), or enum declaration */
TYPE,
/** Field declaration (includes enum constants) */
FIELD,
/** Method declaration */
METHOD,
/** Formal parameter declaration */
PARAMETER,
/** Constructor declaration */
CONSTRUCTOR,
/** Local variable declaration */
LOCAL_VARIABLE,
/** Annotation type declaration */
ANNOTATION_TYPE,
/** Package declaration */
PACKAGE,
/**
* Type parameter declaration
*
* @since 1.8
*/
TYPE_PARAMETER,
/**
* Use of a type
*
* @since 1.8
*/
TYPE_USE
}
@MyAnnotation(value = "hello")
class User{
private Integer id;
private String name;
}
public class AnnotationTest {
public static void main(String[] args) {
Class clazz = User.class;
Annotation[] annotations = clazz.getAnnotations();
for(Annotation annotation:annotations){
System.out.println(annotation);
}
}
}
如果我们需要定义重复注解,就必须给它定义容器类,还要使用 @Repeatable 注解修饰。
@Repeatable(MyAnnotations.class)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "hello";
}
/**
* 容器类
*/
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotations {
RepetitionAnnotation[] value();
}
测试重复定义注解
public class AnnotationTest {
/**
* @Description 获取指定两个数之和
* @param a
* @param b
* @return 两数之和
*/
@MyAnnotation(value = "Hello")
@MyAnnotation(value = "你好")
public int add(int a, int b){
return a + b;
}
}
向 @Target 中添加两种类型 TYPE_PARAMETER和TYPE_USE。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_43598687/article/details/122913951
内容来源于网络,如有侵权,请联系作者删除!