http://bbs.itheima.com/thread-23776-1-1.html?fstgj以前的学习网站,需要的自己看下,可以去这个网站下载,下载视频免费,不需要注册和做什么任务。
其实际不会也不能影响代码的实际逻辑,仅仅起到辅助性标记的作
用。而对于java的注解jdk包java.lang.annotation有详细的介绍。
元注解是指注解的注解,JAVA JDK中提供了四种元注解,分别是:
@Document 标明该注解将会包含至javaDoc文档中。 JDK1.5 +
@Inherited 标明该注解可以由子类继承。 JDK1.5 +
@Retention 标明注解的保留策略。JDK1.5 +
JDK提供了三种保留策略:
@Retention(RetentionPolicy.SOURCE) -- 注解只存在于源代码中,字节码Class文件中将不存在该注解。
@Retention(RetentionPolicy.CLASS) -- 标明注解只会被编译器编译后保留在Class字节码文件中,而运行时无法获取。
@Retention(RetentionPolicy.RUNTIME) -- 标明注解会保留在class字节码文件中,且运行时能通过反射机制获取。
JDK源码:
?
public enum RetentionPolicy {
/**
* Annotations are to be discarded by the compiler.
*/
SOURCE,
/**
* Annotations are to be recorded in the class file by the compiler
* but need not be retained by the VM at run time. This is the default
* behavior.
*/
CLASS,
/**
* Annotations are to be recorded in the class file by the compiler and
* retained by the VM at run time, so they may be read reflectively.
*
* @see java.lang.reflect.AnnotatedElement
*/
RUNTIME
}
@Target 标明注解的作用目标对象。
其作用对象主要有:
JDK源码
?
public enum ElementType {
<br> /** Class, interface (including annotation type), or enum declaration */ -- 标注类,接口,注解,枚举<br> TYPE,
/** Field declaration (includes enum constants) */ --标注字段,枚举常量
FIELD,
/** Method declaration */ -- 标注方法
METHOD,
/** Parameter declaration */ -- 标注参数
PARAMETER,
/** Constructor declaration */--标注构造器
CONSTRUCTOR,
/** Local variable declaration */ -- 标注局部变量
LOCAL_VARIABLE,
/** Annotation type declaration */ -- 标注注解
ANNOTATION_TYPE,
/** Package declaration */ -- 标注包
PACKAGE
}
了解到java注解的元注解后,如果需要自定义java注解,该怎么样定义?
1:自定义注解:
使用关键字:@interface
1.1 自定义一个类注解
?
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;
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface AkClass {
String value() default "hello";
}
1.2 类注解的使用,如:
?
import demo.annontation.AkClass;
@AkClass()
public interface AkClassTest {
public abstract void getAK();
}
1.3 通过java反射机制获取和解析类注解,如:
注意:只有当类注解使用了RetentionPolicy.RUNTIME保留策略,才能在运行时,通过java反射机制获取
?
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import demo.annontation.AkClass;
import demo.annontation.AkMethod;
/**
* 掃描當前包裏面,哪些類被AkClass類注解標記過
*
*/
public class Main {
public static void main(String[] args) {
//判斷某個類是否是注解
System.out.println("對象是否為注解類型:"+AkClassTest.class.isAnnotation());
System.out.println("調用類指定的類注解屬性值:"+AkClassTest.class.getAnnotation(AkClass.class).value());
//獲取某個具體類的所有注解
Annotation[] annotations = AkClassTest.class.getAnnotations();
for(Annotation annotation : annotations){
//判斷當前注解對象是否為自定義注解
if(annotation.annotationType() == AkClass.class){
System.out.println("類注解名稱:"+AkClass.class.getSimpleName());
Method[] methods = AkClass.class.getDeclaredMethods();
for(Method method : methods){
System.out.println("類注解方法:"+method.getName());
}
System.out.println();
}
}
System.out.println("獲取某個類中所有方法的所有方法注解");
Method[] methods = AkClassTest.class.getMethods();
for(Method method : methods){
System.out.println("類方法名:"+method.getName());
System.out.println("調用方法注解的屬值性:"+method.getAnnotation(AkMethod.class).value());
Annotation[] mAnnotations = method.getAnnotations();
for(Annotation mAnnotation : mAnnotations){
if(mAnnotation.annotationType() == AkMethod.class){
System.out.println("注解名:"+AkMethod.class.getSimpleName());
}
}
}
}
}
13 个解决方案
#1
好文章不错的
#2
#3
客主这篇策略解析,让我快速打开了java注解的大门!不错,力挺!!!
#4
用的时候怎么用呢,不能每一个方法都调用解析注解吧
#5
说实话 用完注解再也不想用配置文件了
#6
注解确实很方便
#7
不错不错,正在学习这个
#8
我是来收藏的
#9
赞一个!!
#10
太多了,好复杂
我们学的时候做项目就是在每个类上注解,也就三四个。、
1、@author
用来标注该类的作者信息
/**
* 这个是一个类
* @author Xiloer
*
*/
2、@since
用来标注从哪个版本开始启用
/**
* 这是一个普通方法
* @since 1.5.1
*/
3、@param
用来标注方法的参数说明
/**
* 这是一个普通方法
* @param name 该参数用来设置当前用户的名字
*/
public void setName(String name){
.....
}
4、@return
用来标注方法的返回值说明
/**
* 获取当前用户的用户名
* @return 当前用户的用户名
*/
public String getName(){....}
我们学的时候做项目就是在每个类上注解,也就三四个。、
1、@author
用来标注该类的作者信息
/**
* 这个是一个类
* @author Xiloer
*
*/
2、@since
用来标注从哪个版本开始启用
/**
* 这是一个普通方法
* @since 1.5.1
*/
3、@param
用来标注方法的参数说明
/**
* 这是一个普通方法
* @param name 该参数用来设置当前用户的名字
*/
public void setName(String name){
.....
}
4、@return
用来标注方法的返回值说明
/**
* 获取当前用户的用户名
* @return 当前用户的用户名
*/
public String getName(){....}
#11
#12
写的不错,受益了。。。
#13
感觉不会用太多 多的话还不如配置文件呢
#1
好文章不错的
#2
#3
客主这篇策略解析,让我快速打开了java注解的大门!不错,力挺!!!
#4
用的时候怎么用呢,不能每一个方法都调用解析注解吧
#5
说实话 用完注解再也不想用配置文件了
#6
注解确实很方便
#7
不错不错,正在学习这个
#8
我是来收藏的
#9
赞一个!!
#10
太多了,好复杂
我们学的时候做项目就是在每个类上注解,也就三四个。、
1、@author
用来标注该类的作者信息
/**
* 这个是一个类
* @author Xiloer
*
*/
2、@since
用来标注从哪个版本开始启用
/**
* 这是一个普通方法
* @since 1.5.1
*/
3、@param
用来标注方法的参数说明
/**
* 这是一个普通方法
* @param name 该参数用来设置当前用户的名字
*/
public void setName(String name){
.....
}
4、@return
用来标注方法的返回值说明
/**
* 获取当前用户的用户名
* @return 当前用户的用户名
*/
public String getName(){....}
我们学的时候做项目就是在每个类上注解,也就三四个。、
1、@author
用来标注该类的作者信息
/**
* 这个是一个类
* @author Xiloer
*
*/
2、@since
用来标注从哪个版本开始启用
/**
* 这是一个普通方法
* @since 1.5.1
*/
3、@param
用来标注方法的参数说明
/**
* 这是一个普通方法
* @param name 该参数用来设置当前用户的名字
*/
public void setName(String name){
.....
}
4、@return
用来标注方法的返回值说明
/**
* 获取当前用户的用户名
* @return 当前用户的用户名
*/
public String getName(){....}
#11
#12
写的不错,受益了。。。
#13
感觉不会用太多 多的话还不如配置文件呢