Web前端最全JavaSE学习笔记--Item1 注解Annotation_@item注解(1),前端高级面试2024

最后

技术是没有终点的,也是学不完的,最重要的是活着、不秃。零基础入门的时候看书还是看视频,我觉得成年人,何必做选择题呢,两个都要。喜欢看书就看书,喜欢看视频就看视频。最重要的是在自学的过程中,一定不要眼高手低,要实战,把学到的技术投入到项目当中,解决问题,之后进一步锤炼自己的技术。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

技术学到手后,就要开始准备面试了,找工作的时候一定要好好准备简历,毕竟简历是找工作的敲门砖,还有就是要多做面试题,复习巩固。


Child   
 ![这里写图片描述](https://img-blog.csdn.net/20160113165857982)


Annotation 其实就是代码里的特殊标记, 它用于替代配置文件,也就是说,传统方式通过配置文件告诉类如何运行,有了注解技术后,开发人员可以通过注解告诉类如何运行。在Java技术里注解的典型应用是:**可以通过反射技术去得到类里面的注解,以决定怎么去运行类。**


掌握注解技术的要点:


* 如何定义注解
* 如何反射注解,并根据反射的注解信息,决定如何去运行类


### 一、注解的基本知识


##### **1、如何定义注解**


定义新的 Annotation 类型使用 **@interface** 关键字


`public @interface 注解的名称{}`


##### **2、定义注解中的属性**


注解属性的作用:原来写在配置文件中的信息,可以通过注解的属性进行描述。   
 `类型 属性名称() [default 默认值]`;


Annotation 的属性声明方式:`String name();`   
 属性默认值声明方式:`String name() default “xxx”`;   
 特殊属性value:如果注解中有一个名称value的属性,那么使用注解时可以省略value=部分,如`@MyAnnotation(“xxx")`,但是出现多个属性时,那就应该要写上value值,这样比较明确。


定义一个MyAnno1的注解,同时定义一个MyAnno2 ,MyAnno2 作为MyAnno1的一个属性。



public @interface MyAnno2 {
int num();
}



//所有定义的注解都是java.lang.annotation.Annotation的子类

//定义注解
public @interface MyAnno1 {
String name() default “”;//注解的属性
int age() default 0;
// MyAnno2[] myann(); //属性还可以是注解,注解数组
String [] value() default “”;
}


使用自定义的注解



//使用自定义的注解
public class UseMyAnno1 {

// @MyAnno1(name = “abc”, age = 19, myann = { @MyAnno2(num = 20),
// @MyAnno2(num = 200) }) //myann是一个注解数组。
// public void method() {
//
// }

//@MyAnno1("abc") 就是给注解的value属性赋值
@MyAnno1(value={"def","ddd"},age=10)
public void method() {

}
}


特别注意:类型必须是基本类型、String、Class、注解类型、枚举及以上类型的一维数组。


### 二、注解的反射


##### **1、 AnnotationElement 接口**


JDK 5.0 在 java.lang.reflect 包下新增了 AnnotationElement 接口, 该接口代表程序中可以接受注释的程序元素,具有如下方法


![这里写图片描述](https://img-blog.csdn.net/20160113172506950)


* T getAnnotation(Class clazz):得到指定的注解类型
* Annotation[] getAnnotations():得到所有的注解类型
* Annotation[] getDeclaredAnnotations():得到自己上面的直接的注解类型
* boolean isAnnotationPresent(Class clazz):有没有指定的注解


**Class、Method、Field、Constructor等都实现了该接口。**   
 实例:编写一个自己的注解Anno1,在MyClass1中使用该注解,MyClass2继承MyClass1,这样,MyClass2也具有MyClass1上的注解,但是两者还是有差别的,看如下代码



package com.itheima.other.metaanno;

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

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
@Documented
@Inherited
public @interface Anno1 {

}


MyClass1 



package com.itheima.other.metaanno;
/**
* 这是一个测试类
* @author wzhting
*
*/
@Anno1
public class MyClass1 {

}


MyClass2 



package com.itheima.other.metaanno;

import java.lang.annotation.Annotation;

public class MyClass2 extends MyClass1 {
public static void main(String[] args) {
Class clazz = MyClass2.class;
// Anno1 a1 = (Anno1) clazz.getAnnotation(Anno1.class);
// System.out.println(a1);

    Annotation ans[]  =  clazz.getDeclaredAnnotations();//获取直接存在的注解
    for(Annotation a:ans)
        System.out.println(a);
}

}


比如:判断Object这个类上面有没有MyAnn1的注解



Class clazz = Object.class;
Boolean b = clazz.isAnnotationPresent(MyAnn1.class);


##### **2、注解的生命周期:**


**2.1 AnnotatedElement元注解**


只能用在注解上的注解,就是元注解。JDK中定义了如下元Annotation:


* **`@Retention`**:


@Retention: 只能用于修饰一个 Annotation 定义, 用于指定该 Annotation 可以保留的**域**, @Rentention 包含一个 RetentionPolicy 类型的成员变量, 通过这个变量指定域。


1. RetentionPolicy.CLASS: 编译器将把注解记录在 class 文件中. 当运行 Java 程序时, JVM 不会保留注解. 这是默认值
2. RetentionPolicy.RUNTIME:编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 会保留注解. 程序可以通过反射获取该注释
3. RetentionPolicy.SOURCE: 编译器直接丢弃这种策略的注释


![这里写图片描述](https://img-blog.csdn.net/20160113164625531)


* **`@Target`**:指示注解能用在何处   
 ElementType:指定注解用于修饰类的哪个成员. @Target 包含了一个名为 value,类型为ElementType的成员变量。看源码可知有`TYPE (Class,Interface), FIELD, METHOD, PARAMETER, ANNOTATION_TYPE`等声明常量。


**实例:自定义注解类MyTest** 


首先定义两个实体类,用于单元测试分别为PersonDaoImpl 和测试类PersonDaoImplTest   
 PersonDaoImpl 



package com.itheima.dao.impl;

public class PersonDaoImpl {
public void add(){
System.out.println(“保存了”);
}
public void del(){
System.out.println(“执行了删除”);
}
}


PersonDaoImplTest



package com.itheima.dao.impl;

import org.junit.Test;

public class PersonDaoImplTest {
private PersonDaoImpl dao = new PersonDaoImpl();

//测试方法:必须是public的;没有返回值;没有参数
@MyTest(timeout=1)//===>自己编写MyTest注解
public void testAdd() throws InterruptedException{

// Thread.sleep(100);
dao.add();
}
public void testDel(){
dao.del();
}
}


自定义一个类MyTest,和JUnit的@Test类相似。



package com.itheima.dao.impl;

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

@Retention(RetentionPolicy.RUNTIME)//编译时,JVM保留注解
@Target(ElementType.METHOD)//使用于方法。

public @interface MyTest {
long timeout() default -1;//没有时间限制。单位是毫秒
}

最后

四轮技术面+一轮hr面结束,学习到了不少,面试也是一个学习检测自己的过程,面试前大概复习了 一周的时间,把以前的代码看了一下,字节跳动比较注重算法,面试前刷了下leetcode和剑指offer, 也刷了些在牛客网上的面经。大概就说这些了,写代码去了~

祝大家都能收获大厂offer~

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

篇幅有限,仅展示部分内容

d4c3ab8389e65ecb71ac0)**

篇幅有限,仅展示部分内容

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值