黑马程序员:Java基础总结
java注解
ASP.Net+Android+IO开发
、
.Net培训
、期待与您交流!
java注解
@Deprecated
直接在刚才的类中增加一个方法,并加上@Deprecated标注,在另外一个类中调用这个方法。
@Override
public boolean equals(Reflect other)方法与HashSet结合讲解
总结:
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
看java.lang包,可看到JDK中提供的最基本的annotation。
public
static
void
main(String[] args)
throws
Exception {
if
(Ts0.
class
.isAnnotationPresent(
annotation
.
class
)) {
annotation
anno = (
annotation
) Ts0.
class
.getAnnotation(
annotation
.
class
);
int
[] arr()
default
{ 1, 2, 3 };
orAnno
order()
default
@orAnno
(
"123"
);
RED
,
GREEN
,
YELLOW
;
lang包中的基本注解
@SuppressWarnings
通过System.runFinalizersOnExit(true);的编译警告引出@SuppressWarnings("deprecation")
通过System.runFinalizersOnExit(true);的编译警告引出@SuppressWarnings("deprecation")
@Deprecated
直接在刚才的类中增加一个方法,并加上@Deprecated标注,在另外一个类中调用这个方法。
@Override
public boolean equals(Reflect other)方法与HashSet结合讲解
总结:
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
看java.lang包,可看到JDK中提供的最基本的annotation。
注解的应用结构
//定义一个注解类
@interface
annotation
{
annotation
{
}
//应用了“注解类”的类
@annotation
class
B{}
B{}
//对“应用了注解类的类”进行反射操作的类
class
c{
c{
{
annotation
.
class
.isAnnotation();}
annotation
.
class
.isAnnotation();}
{B.
class
.isAnnotationPresent(
annotation
.
class
);}
class
.isAnnotationPresent(
annotation
.
class
);}
{
annotation
.
class
.getAnnotation(
annotation
.
class
);}
annotation
.
class
.getAnnotation(
annotation
.
class
);}
}
boolean |
isAnnotation() 如果此 Class 对象表示一个注释类型则返回 true。 |
boolean |
isAnnotationPresent(Class<? extends Annotation> annotationClass) 如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。 |
|
getAnnotation(Class<A> annotationClass) 如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。 |
|
Annotation[] |
getAnnotations() 返回此元素上存在的所有注释。 |
自定义注解
元注解
Documented | 指示某一类型的注释将通过 javadoc 和类似的默认工具进行文档化。 |
Inherited | 指示注释类型被自动继承。 |
Retention | 指示注释类型的注释要保留多久。 |
Target | 指示注释类型所适用的程序元素的种类。 |
注释类型 Retention 必需元素摘要 |
|
---|---|
RetentionPolicy |
value |
枚举 RetentionPolicy 枚举常量摘要 |
|
---|---|
CLASS 编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。 |
|
RUNTIME 编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。 |
|
SOURCE 编译器要丢弃的注释。 |
RetetionPolicy.SOURCE、RetetionPolicy.CLASS、RetetionPolicy.RUNTIME;分别对应:java源文件-->class文件-->内存中的字节码。
@Retention
(RetentionPolicy.
SOURCE
)
(RetentionPolicy.
SOURCE
)
@interface
annotation
{
annotation
{
}
思考: @Override、@SuppressWarnings和@Deprecated 对应的是
SOURCE,
SOURCE ,
RUNTIME
SOURCE,
SOURCE ,
RUNTIME
注释类型 Target 必需元素摘要 |
|
---|---|
ElementType[] |
value |
枚举 ElementType 枚举常量摘要 |
|
---|---|
ANNOTATION_TYPE 注释类型声明 |
|
CONSTRUCTOR 构造方法声明 |
|
FIELD 字段声明(包括枚举常量) |
|
LOCAL_VARIABLE 局部变量声明 |
|
METHOD 方法声明 |
|
PACKAGE 包声明 |
|
PARAMETER 参数声明 |
|
TYPE 类、接口(包括注释类型)或枚举声明 |
@Retention
(RetentionPolicy.
SOURCE
)
(RetentionPolicy.
SOURCE
)
@Target
(value = { ElementType.
TYPE
, ElementType.
METHOD
}) //常用
(value = { ElementType.
TYPE
, ElementType.
METHOD
}) //常用
@interface
annotation
{
annotation
{
}
注解增加属性
定义基本类型的属性和应用属性:
在注解类中增加String color();
@MyAnnotation(color="red")
在注解类中增加String color();
@MyAnnotation(color="red")
用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法
MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
System.out.println(a.color());
可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象
MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
System.out.println(a.color());
可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象
为属性指定缺省值:
String value()
default
"default"
;
default
"default"
;
value属性可简写:
String value() default "zxx";
如果注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默认值或者你只有一个value属性),那么可以省略value=部分,例如:@MyAnnotation("lhm")。
String value() default "zxx";
如果注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默认值或者你只有一个value属性),那么可以省略value=部分,例如:@MyAnnotation("lhm")。
数组类型的属性
int [] arrayAttr() default {1,2,3};
@MyAnnotation(arrayAttr={2,3,4})
如果数组属性中只有一个元素,这时候属性值部分可以省略大括
int [] arrayAttr() default {1,2,3};
@MyAnnotation(arrayAttr={2,3,4})
如果数组属性中只有一个元素,这时候属性值部分可以省略大括
枚举类型的属性
EnumTest.TrafficLamp lamp() ;
@MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)
EnumTest.TrafficLamp lamp() ;
@MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)
注解类型的属性:
MetaAnnotation annotationAttr() default @MetaAnnotation("xxxx");
@MyAnnotation(annotationAttr=@MetaAnnotation(“yyy”) )
可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象,同样的道理,可以认为上面这个@MetaAnnotation是MetaAnnotation类的一个实例对象,调用代码如下:
MetaAnnotation ma = myAnnotation.annotationAttr();
System.out.println(ma.value());
MetaAnnotation annotationAttr() default @MetaAnnotation("xxxx");
@MyAnnotation(annotationAttr=@MetaAnnotation(“yyy”) )
可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象,同样的道理,可以认为上面这个@MetaAnnotation是MetaAnnotation类的一个实例对象,调用代码如下:
MetaAnnotation ma = myAnnotation.annotationAttr();
System.out.println(ma.value());
import
java.lang.annotation.Retention;
java.lang.annotation.Retention;
import
java.lang.annotation.RetentionPolicy;
java.lang.annotation.RetentionPolicy;
import
java.lang.annotation.Target;
java.lang.annotation.Target;
import
java.lang.annotation.ElementType;
java.lang.annotation.ElementType;
@annotation
(lap = Lap.
YELLOW
, value =
"default"
)
(lap = Lap.
YELLOW
, value =
"default"
)
public
class
Ts0 {
class
Ts0 {
public
static
void
main(String[] args)
throws
Exception {
if
(Ts0.
class
.isAnnotationPresent(
annotation
.
class
)) {
annotation
anno = (
annotation
) Ts0.
class
.getAnnotation(
annotation
.
class
);
System.
out
.println(anno.order().value());
out
.println(anno.order().value());
}
}
}
// 定义一个注解类
@Retention
(RetentionPolicy.
SOURCE
)
(RetentionPolicy.
SOURCE
)
@Target
(value = { ElementType.
TYPE
, ElementType.
METHOD
})
(value = { ElementType.
TYPE
, ElementType.
METHOD
})
@interface
annotation
{
annotation
{
String value();
int
[] arr()
default
{ 1, 2, 3 };
Lap lap();
orAnno
order()
default
@orAnno
(
"123"
);
}
enum
Lap {
Lap {
RED
,
GREEN
,
YELLOW
;
}
// 另一个注视
@interface
orAnno
{
orAnno
{
String value();
}
ASP.Net+Android+IO开发
、
.Net培训
、期待与您交流!