Java注解,Java开发社招面试经验

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

System.out.println(t.role());

}

}

运行结果

1

CEO

husband

father

son

注解的属性


注解的属性也叫做成员变量。注解只有成员变量,没有方法。注解的成员变量在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public @interface TestAnnotation{

int id();

String msg();

}

上面代码定义了 @TestAnnotation 这个注解中拥有 id 和 msg 两个属性。在使用的时候,我们应该给它们进行赋值。

赋值的方式是在注解的括号内以 value=“” 形式,多个属性之前用 ,隔开。

@TestAnnotation(id=3, msg=“hello annotation”)

public class Test {

}

快捷方式


所谓的快捷方式就是注解中定义了名为value的元素,并且在使用该注解时,如果该元素是唯一需要赋值的一个元素,那么此时无需使用key=value的语法,而只需在括号内给出value元素所需的值即可。这可以应用于任何合法类型的元素,记住,这限制了元素名必须为value,简单案例如下

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

@interface IntegerVaule{

int value() default 0;

String name() default “”;

}

public class QuicklyWay {

@IntegerVaule(20)

public int age;

@IntegerVaule(value = 10000, name = “MONEY”)

public int money;

}

注解不支持继承


注解是不支持继承的,因此不能使用关键字extends来继承某个@interface,但注解在编译后,编译器会自动继承java.lang.annotation.Annotation接口

声明注解


这里总共定义了4个注解来演示注解的声明

  1. 定义一个可以注解在Class,interface,enum上的注解

  2. 定义一个可以注解在METHOD上的注解

  3. 定义一个可以注解在FIELD上的注解

  4. 定义一个可以注解在PARAMETER上的注解

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public @interface MyAnTargetType {

/**

  • 定义注解的一个元素 并给定默认值

  • @return

*/

String value() default “定义在类接口枚举类上的注解元素value的默认值”;

}

@Target({ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

public @interface MyAnTargetMethod {

/**

  • 定义注解的一个元素 并给定默认值

  • @return

*/

String value() default “定义在方法上的注解元素value的默认值”;

}

@Target({ElementType.FIELD})

@Retention(RetentionPolicy.RUNTIME)

public @interface MyAnTargetField {

/**

  • 定义注解的一个元素 并给定默认值

  • @return

*/

String value() default “定义在字段上的注解元素value的默认值”;

}

@Target({ElementType.PARAMETER})

@Retention(RetentionPolicy.RUNTIME)

public @interface MyAnTargetParameter {

/**

  • 定义注解的一个元素 并给定默认值

  • @return

*/

String value() default “定义在参数上的注解元素value的默认值”;

}

编写一个测试处理类处理以上注解

@MyAnTargetType

public class AnnotationTest {

@MyAnTargetField

private String field = “我是字段”;

@MyAnTargetMethod(“测试方法”)

public void test(@MyAnTargetParameter String args) {

System.out.println("参数值 === " + args);

}

public static void main(String[] args) {

// 获取类上的注解MyAnTargetType

MyAnTargetType t = AnnotationTest.class.getAnnotation(MyAnTargetType.class);

System.out.println("类上的注解值 === " + t.value());

MyAnTargetMethod tm = null;

try {

// 根据反射获取AnnotationTest类上的test方法

Method method = AnnotationTest.class.getDeclaredMethod(“test”, String.class);

// 获取方法上的注解MyAnTargetMethod

tm = method.getAnnotation(MyAnTargetMethod.class);

System.out.println("方法上的注解值 === " + tm.value());

// 获取方法上的所有参数注解 循环所有注解找到MyAnTargetParameter注解

Annotation[][] annotations = method.getParameterAnnotations();

for (Annotation[] tt : annotations) {

for (Annotation t1 : tt) {

if (t1 instanceof MyAnTargetParameter) {

System.out.println("参数上的注解值 === " + ((MyAnTargetParameter) t1).value());

}

}

}

method.invoke(new AnnotationTest(), “改变默认参数”);

// 获取AnnotationTest类上字段field的注解MyAnTargetField

MyAnTargetField fieldAn = AnnotationTest.class.getDeclaredField(“field”).getAnnotation(MyAnTargetField.class);

System.out.println("字段上的注解值 === " + fieldAn.value());

} catch (Exception e) {

e.printStackTrace();

}

}

}

输出结果

类上的注解值 === 定义在类接口枚举类上的注解元素value的默认值

方法上的注解值 === 测试方法

参数上的注解值 === 定义在参数上的注解元素value的默认值

参数值 === 改变默认参数

字段上的注解值 === 定义在字段上的注解元素value的默认值

Java预置的注解


学习了上面相关的知识,我们已经可以自己定义一个注解了。其实 Java 语言本身已经提供了几个现成的注解。

@Deprecated

这个元素是用来标记过时的元素,想必大家在日常开发中经常碰到。编译器在编译阶段遇到这个注解时会发出提醒警告,告诉开发者正在调用一个过时的元素比如过时的方法、过时的类、过时的成员变量。

@Override

这个大家应该很熟悉了,用于标明此方法覆盖了父类的方法。

@SuppressWarnings

用于有选择的关闭编译器对类、方法、成员变量、变量初始化的警告。之前说过调用被 @Deprecated 注解的方法后,编译器会警告提醒,而有时候开发者会忽略这种警告,他们可以在调用的地方通过 @SuppressWarnings 达到目的。

@SafeVarargs

参数安全类型注解。它的目的是提醒开发者不要用参数做一些不安全的操作,它的存在会阻止编译器产生 unchecked 这样的警告。它是在 Java 1.7 的版本中加入的。

@FunctionalInterface

函数式接口注解,这个是 Java 1.8 版本引入的新特性。函数式编程很火,所以 Java 8 也及时添加了这个特性。

函数式接口 (Functional Interface) 就是一个具有一个方法的普通接口。

我们进行线程开发中常用的 Runnable 就是一个典型的函数式接口,从源码可以看到它使用了@FunctionalInterface 注解。

注解应用实例


注解的功能很强大,Spring和Hebernate这些框架在日志和有效性中大量使用了注解功能。

注解通常配合反射或者切面一起使用来实现相应的业务逻辑。

我这里向大家演示使用注解和切面进行日志记录的案例

定义一个系统日志注解

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface SysLog {

/**

  • 操作说明

*/

String value() default “”;

}

找到使用了注解的方法,利用切面进行日志记录

这里有些类或者参数只做演示,没有给出具体的实现(如SysLogMapper、SysLogEntity等),以看懂注解配合切面使用为目的

@Aspect

@Component

public class SysLogAspect {

@Autowired

private SysLogMapper sysLogMapper;

@Pointcut(“@annotation(com.jourwon.annotation.SysLog)”)

public void logPointCut() {

}

@Around(“logPointCut()”)

public Object around(ProceedingJoinPoint point) throws Throwable {

long beginTime = System.currentTimeMillis();

//执行方法

Object result = point.proceed();

//执行时长(毫秒)

long time = System.currentTimeMillis() - beginTime;

//保存日志

saveSysLog(point, time);

return result;

}

private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {

MethodSignature signature = (MethodSignature) joinPoint.getSignature();

Method method = signature.getMethod();

SysLogEntity sysLog = new SysLogEntity();

SysLog syslog = method.getAnnotation(SysLog.class);

if (syslog != null) {

//注解上的描述

sysLog.setOperation(syslog.value());

}

//保存系统日志

sysLogMapper.insertSelective(sysLog);

}

}

最后

Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

ull) {

//注解上的描述

sysLog.setOperation(syslog.value());

}

//保存系统日志

sysLogMapper.insertSelective(sysLog);

}

}

最后

Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
[外链图片转存中…(img-Ys2v6OGE-1713627577554)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-WgMXKsAs-1713627577554)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值