注解和注释区分
注释(comment)是给人看的,注解既可以给人看还可以给机器看。
注解定义
1、注解(Annotation)是Java语言的一种特性,用于为程序代码提供元数据(metadata)。它们不直接影响程序代码的执行,而是提供有关代码的额外信息,这些信息可以被编译器、解释器或其他工具用来进行特定的处理。
2、在Java中,注解使用**@符号作为前缀**,并放置在类、方法、变量等程序元素的前面。注解可以带有参数,参数以键值对的形式指定,也可以没有参数。
3、Java提供了一些内置的注解,例如**@Override、@Deprecated、@SuppressWarnings**等。除了内置注解之外,开发人员还可以自定义注解,以满足特定需求。
4、我们可以通过反射机制编程实现对于这些元数据的访问
内置注解
1、@Override:定义在java.lang.Override中的。用于声明打算重写一个方法。
2、@Deprecated:定义在java.lang.Deprecated中,通常用于提醒程序员不鼓励使用这样的元素,通常是因为它很危险或者存在更好的选择。在调用的时候会多一道杠。
3、@SuppressWarnings:定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息。
这个注解需要加一些参数才可以使用:
@SuppressWarnings(“all”)
@SuppressWarnings(“unchecked”)
@SuppressWarnings(value={“unchecked”,“deprecation”})…
比如:
在这个test()方法中,如果没有 @SuppressWarnings(“all”)会警告Variable “list” is never used,加了之后就不会提示了。
@SuppressWarnings("all")
public void test(){
List list = new ArrayList();
}
元注解
**作用:**负责解释其他注解,Java提供了4种标准的meta-annotation类型,他们被用来对其他annotation类型作说明。
四种元注解:
@Target:用于描述注解的范围,被描述的注解可以用在什么地方
@Target(value= ElementType.METHOD)中value=也可以是一个数组,表示注解作用目标有多个
class Test{
@MyAnnotation2
int age = 0;
@MyAnnotation
public void testTarget(){
}
}
//MyAnnotation注解的作用目标为ElementType里的METHOD类,因此只能用在方法上,用在别的上会报错
@Target(value= ElementType.METHOD)
@interface MyAnnotation{
}
//MyAnnotation2注解的作用目标为ElementType里的FIELD类,因此只能用在字段上,用在别的上会报错
@Target(value= ElementType.FIELD)
@interface MyAnnotation2{
}
比如常用的Ovveride方法中,@Target(ElementType.METHOD)的ElementType就是METHOD,说明作用范围是方法。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
@Retention:表示注解在代码三个生命周期(SOURCE<CLASS<RUNTIME)哪一个生命周期还有效
比如常用的Ovveride方法中,@Retention(RetentionPolicy.SOURCE)的RetentionPolicy就是SOURCE,说明在源码中有效,但是该注解一旦被编译成字节码文件就失效了。SuppressWarnings也是在源码中有效,因为当编程class之后这个镇压警告就失效了。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
@Deprecated 是在RUNTIME即运行时有效。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
@Documented:表示是否将我们的注解生成在javadoc中
@Inherited:说明子类可以继承父类中的该注解
自定义注解举例
声明格式:public @interface 注释名{定义内容}
class Test{
int age = 0;
@MyAnnotation(name = "zonda")
public void test(){
}
@MyAnnotation2("zonda")//注解MyAnnotation2中只有一个值value,因此不需要value=“zonda”。
public void test2(){
}
}
@Target({ElementType.METHOD,ElementType.TYPE})//只在方法和类上面有效
@Retention(RetentionPolicy.RUNTIME)//只在运行时有效
@Documented//这个元注解一般不用写
@Inherited//这个元注解一般不用写
@interface MyAnnotation{
String name();//注解参数。参数类型 参数名();
int age() default 0;//如果设置了默认值,可以不赋值
}
@interface MyAnnotation2{
String value();
}
通过反射机制读取注解
package Annotation;
import java.lang.annotation.Annotation;
/**
* @author Zonda
* @version 1.0
*/
public class TestAnnotation {
public static void main(String[] args) throws Exception{
Class<?> aClass = Class.forName("beans.User");
if (aClass.isAnnotationPresent(Comment.class)) {
Comment annotation = aClass.getAnnotation(Comment.class);
System.out.println(annotation.value());
}
}
}
1598

被折叠的 条评论
为什么被折叠?



