学习关于Java中的注解
在学习Java的注解时,我顺便整理了一下。这篇文章是关于注解的基本语法和用法的解释。有一些部分是在和chatGTP进行问答的过程中理解的,所以示例等内容大部分是由GPT生成的。
基本的注释的用法和概述
首先,什么是标注?
直译的意思是“注释”。
注释是指“对词语或句子进行简明解释的东西”。
在Java中,注解是指元数据标记的一种方法。
可以通过将与应用程序逻辑无直接关联的附加信息(元数据)添加到代码中来实现。Java提供了一些预定义的”标准注解”,也可以创建自定义的原始注解。
在Spring Framework中提供了一些注解。
如果想要让框架的扩展功能具有特定的行为或操作,我们也可以利用注解。
使用方法
基本的的注解语法从@符号开始,然后跟着注解的名称。
在添加注解时,将其放在类、接口、方法等元素的开头。
具体的描述示例将在后面说明。
使用标注的好处
能够明确表示代码的含义
@override等指明了方法在父类中被重写,为代码读者提供了代码的含义。
利用静态分析来解决问题的早期。
通过使用静态分析工具和集成开发环境,可以及早发现错误和问题的警告。
这可以提高开发效率。
关于标准注释
標準ライブラリ指的是內建於程式庫中的標準註解。由於無法一一列舉所有,因此只介紹一些代表性的註解。
@覆盖
方法表明在父类中被覆盖。
class MyBaseClass {
public void myMethod() {
// メソッドの実装
}
}
class MyDerivedClass extends MyBaseClass {
@Override
public void myMethod() {
// オーバーライドしたメソッドの実装
}
}
@过时的
表明该方法或类已被官方不推荐。
class DeprecatedExample {
@Deprecated
public void oldMethod() {
// 古いメソッドの実装
}
}
忽略警告
为了抑制特定警告,可以使用注释。
如下示例中,采用注释来抑制编译时的过时警告。
注释的参数可以在括号内指定。
class SuppressWarningExample {
@SuppressWarnings("deprecation")
public void useDeprecatedMethod() {
// 非推奨のメソッドを使用するが、警告を抑制
DeprecatedExample deprecatedExample = new DeprecatedExample();
deprecatedExample.oldMethod();
}
}
使用自定义注释
可以创建独立的注释。
但是要注意,滥用会导致代码难以阅读,降低可读性。
创建定制注释
要自制批注标记,需要使用以下的”元批注”。
@保留:指定注释的保留期限
在Java中存在着以下三项策略。
-
RetentionPolicy.SOURCE(ソースレベル)
ソースコード内でのみ有効であり、コンパイル時に取り除かれる。実行時には利用できない。
主にコード生成などのツールが使用する場合に適しているらしい。
RetentionPolicy.CLASS(クラスレベル)
コンパイルされたクラスファイルに保持されるが、実行時には利用出来ない。
リフレクションを使用せずにアノテーションプロセッサがクラスファイルを処理する際に利用するらしい。
RetentionPolicy.RUNTIME(実行時)
コンパイルされたクラスファイルに保持され、実行時にも利用出来る。
リフレクションを使用して実行時にアノテーションを取得する場合、このリテンションポリシーが必要らしい。
※反思是指程序自行调查或操作其自身结构的机制。
@目标:指定注解可以应用于哪种类型的元素。
ElementType.METHOD
メソッドに対して適用する際に指定する
ElementType.TYPE
クラスに対して適用する際に指定する
ElementType.FIELD
フィールドに対して適用する際に指定する
ElementType.CONSTRUCTOR
コンストラクタに対して適用する際に指定する
创建一个名为「MyCustomAnnotation」的注释的示例。
メソッドに対して適用する際に指定する
ElementType.TYPE
クラスに対して適用する際に指定する
ElementType.FIELD
フィールドに対して適用する際に指定する
ElementType.CONSTRUCTOR
コンストラクタに対して適用する際に指定する
ChatGPT帮助理解时的一个示例。
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// カスタムアノテーションの定義
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyCustomAnnotation {
String value() default "Default Value";
int count() default 1;
}
在main方法中使用自己编写的注解,通过反射的方式执行myAnnotatedMethod。动态地输出myAnnotatedMethod中附带的值。
import java.lang.reflect.Method;
public class MyClass {
@MyCustomAnnotation(value = "Custom Value", count = 3)
public void myAnnotatedMethod() {
System.out.println("Executing myAnnotatedMethod");
}
public static void main(String[] args) {
// リフレクションを使用してアノテーションの情報を取得
try {
// myAnnotatedMethodメソッドに付与されたアノテーションを取得
Method method = MyClass.class.getMethod("myAnnotatedMethod");
MyCustomAnnotation annotation = method.getAnnotation(MyCustomAnnotation.class);
// アノテーションの情報を表示
if (annotation != null) {
System.out.println("Value: " + annotation.value());
System.out.println("Count: " + annotation.count());
}
// アノテーションの情報を利用して動的な振る舞いを実現
if (annotation != null && annotation.count() > 1) {
for (int i = 0; i < annotation.count(); i++) {
System.out.println("Executing myAnnotatedMethod iteration " + (i + 1));
method.invoke(new MyClass()); // メソッドの実行
}
}
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
}
关于Spring框架中的注解。
如果我们想要使用框架本身的扩展功能来实现特定的行为或操作时,可以利用它。
由于无法列举所有情况,我将列举在工作中经常遇到的一些注解。
@Controller 控制器
用控制器类来表示
@Service表示
证明它是一个服务类
@Repository
这表示了它是一个仓库类。
@RequestParam 参数
这被用于获取HTTP请求的参数。
@RequestMapping 注解
用于将HTTP请求映射到控制器方法。
通过这样做,可以指定哪个URL对应哪个控制器方法。
使用@GetMapping
用于映射HTTP GET请求和控制器方法。
是@RequestMapping的简化版本。可以实现比@RequestMapping更简洁的代码。
发布请求
用于映射HTTP POST请求和控制器方法。
是@RequestMapping的简化版本。能够实现更简洁的代码比@RequestMapping。
@Component 组件
Spring Framework的组件扫描目标类上使用的注解。
组件扫描是指扫描类加载器以自动将特定的类注册到DI容器中,这就是所谓的Bean。
当检测到带有@Component注解的类时,它将被注册到Spring容器中。
随后,其他类在使用该组件时,实例将通过依赖注入自动提供。
(附言)Bean的生命周期
使用@Autowired
在Spring框架中,用于实现依赖注入(DI)并自动注入到组件或Bean中。
通过在字段、setter方法或构造函数上使用@Autowired注解,Spring将注入该类的实例的依赖性。