Java中的注解

1.注解Annotation

@Override 告诉编译器这个方法是覆盖父类的方法

@WebServlet(“/test”) 表示某个类是一个Servlet,Web容器就会识别这个注解,在运行的时候调用它

@Controller(“/test”) 表示某个类是一个控制器,告诉Spring框架该类是一个控制器

注解和注释是完全不同的两个东西,看起来有点类似,其实完全不同,注解会影响程序的运行。

注释是给开发人员看的,不会影响程序的编译和运行。注解并不是给开发人员看的,是用于给程序看的,会影响程序的编译和运行,编译器,Tomcat,框架。

1.1注解的作用范围

自定义开发一个Web容器,基本功能是加载Servlet,需要管理它的生命周期,所以必须先
识别程序中的哪些类是Servlet。

程序启动的时候,扫描所有的类,找出添加了@WebServlet注解的类,进行加载

@WebServlet 是在程序运行的时候起作用的,Java就把它的作用范围规定为RUNTIME。

@Override 是给编译器看的,编译器工作的时候识别出包含了@Override注解的方法,就去检查它上层父类的相应方法,存在责通过,否则报错。

@Override 是编译时候起作用,Java就把它的作用范围规定为SOURCE

1.2 @Target指定注解针对的地方

ElementType:
ElementType.TYPE	针对类、接口
ElementType.FIELD	针对成员变量
ElementType.METHOD	针成员方法
ElementType.PARAMETER	针对方法参数	
ElementType.CONSTRUCTOR	针对构造器
ElementType.PACKAGE	针对包
ElementType.ANNOTATION_TYPE	针对注解

1.3 @Retention 指定注解的保留域

RetentionPolicy
RetentionPolicy.SOURCE	源代码级别,由编译器处理,处理之后就不再保留
RetentionPolicy.CLASS	注解信息保留到类对应的Class文件中
RetentionPolicy.RUNTIME	由JVM读取,运行时使用

1.4自定义注解

package com.southwind.annotation;

/**
 * @PackageName:com.southwind.annotation
 * @ClassName: InitDemo
 * @Description 新建Java class中选择Annotation,创建一个InitMethod的class,仅仅起一个标柱的作用
 * @author aaenen
 * @date 2021/2/27 23:29
 */
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author aaenen
 * @create 2021-02-27 23:24
 */
//表明这个注解针对成员方法使用,放在其他地方报错
@Target(ElementType.METHOD)
// 表明此注解由JVM读取,运行时使用,所以需要一个test
@Retention(RetentionPolicy.RUNTIME)
public @interface InitMethod {

}
package com.southwind.annotation;

/**
 * @PackageName:com.southwind.annotation
 * @ClassName: InitDemo
 * @Description 创建一个InitDemo的class调用注解
 * @author aaenen
 * @date 2021/2/27 23:29
 */
public class InitDemo {
    @InitMethod
    public void init(){
        System.out.println("init...");
    }

    @InitMethod
    public void test(){
        System.out.println("test...");
    }

}
package com.southwind.annotation;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

/**
 * @PackageName:com.southwind.annotation
 * @ClassName: Test
 * @Description 创建一个测试文件Test,测试是否调用了注解
 * @author aaenen
 * @date 2021/2/27 23:27
 */
public class Test {
    public static void main(String[] args) throws Exception {
        //找到InitDemo的类
        Class clazz = Class.forName("com.southwind.annotation.InitDemo");
        //遍历class,将里面的方法全拿出来
        Method[] methods=  clazz.getMethods();
        if (methods != null){
            //遍历方法,找到是否有@WebServlet注解的类
            for (Method method : methods){
                //boolean判断是否有某个注解
                boolean isInitMethod = method.isAnnotationPresent(InitMethod.class);
                System.out.println(method.getName() + ":" + isInitMethod);
                //存在某个注解,反射机制在某个类被加载的时候就执行
                if (isInitMethod){
                    method.invoke(clazz.getConstructor().newInstance(),null);
                }
            }
        }
    }
}

2.Java中的名称命名规范

  1. 包名:多单词组成时所有字母都小写:xxxyyyzzz
  2. 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYxxZzz
  3. 变量名、方法名:多单词组成时,第一个单词的首字母大写,第二个单词开始每个单词首字母大写:xxxYyyZzz
  4. 常量名:所有字母都大写,多单词时每个单词用下划线连接:XXX_YYY_ZZZ
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值