JAVA⽅法别名注解,Java注解(Annotation)中-⽰例
1、JDK⾃带(java.lang)
"@Deprecated 和 @Override" 类似,"@Documented, @Inherited, @Retention, @Target" 类似。
1.1 @ Override
若某个⽅法被 @Override 的标注,则意味着该⽅法会覆盖⽗类中的同名⽅法。如果有⽅法被 @Override 标⽰,但⽗类中却没有"被
@Override 标注"的同名⽅法,则编译器会报错。
public class OverrideTest {
/**
* toString() 在java.lang.Object中定义;
* 因此,这⾥⽤ @Override 标注是对的。
*/
@Override
public String toString(){
return "Override toString";
}
/**
* getString() 没有在OverrideTest的任何⽗类中定义;
* 但是,这⾥却⽤ @Override 标注,因此会产⽣编译错误!
* 将 getString() 上⾯的 @Override注释掉",即可解决该错误。
*/
@Override
public String getString(){
return "get toString";
}
}
1.2 @Deprecated
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Deprecated {
/*
说明:
(01) @interface -- 它的⽤来修饰 Deprecated,意味着 Deprecated 实现了 java.lang.annotation.Annotation 接⼝;即 Deprecated 就是⼀个注解。 (02) @Documented -- 它的作⽤是说明该注解能出现在 javadoc 中。
(03) @Retention(RetentionPolicy.RUNTIME) -- 它的作⽤是指定 Deprecated 的策略是 RetentionPolicy.RUNTIME。这就意味着,编译器会将Deprecated 的信息保留在 .class ⽂件中,并且能被虚拟机读取。
(04) @Deprecated 所标注内容,不再被建议使⽤。
*/
}
⽐如,若某个⽅法被@Deprecated标注,则该⽅法不在便建议使⽤,如果再⽤或者重写该⽅法,编译器会有相应的警告信息:
public class DeprecatedTest {
// @Deprecated 修饰 getString1(),表⽰ 它是建议不被使⽤的函数
@Deprecated
private static void getString1(){
System.out.println("Deprecated Method");
}
private static void getString2(){
System.out.println("Normal Method");
}
// Date是⽇期/时间类。java已经不建议使⽤该类了
private static void testDate() {
Date date = new Date(113, 8, 25);
System.out.Year());
}
// Calendar是⽇期/时间类。java建议使⽤Calendar取代Date表⽰"⽇期/时间"
private static void testCalendar() {
Calendar cal = Instance();
System.out.(Calendar.YEAR));
}
public static void main(String[] args) {
getString1(); //建议不再使⽤ getString1();
getString2();//没有被 @Deprecated 标注,它的显⽰正常;
testDate(); //java 已经建议不再使⽤;
testCalendar();//调⽤了 Calendar 的 API 来操作⽇期/时间,java 建议⽤ Calendar 取代 Date。因此,操作 Calendar 不会产⽣warning。
}
}
1.3 @Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
/*
说明:
(01) @interface -- 它的⽤来修饰 Inherited,意味着 Inherited 实现了 java.lang.annotation.Annotation 接⼝;即 Inherited 就是⼀个注解。
(02) @Documented -- 它的作⽤是说明该注解能出现在 javadoc 中。
(03) @Retention(RetentionPolicy.RUNTIME) -- 它的作⽤是指定 Inherited 的策略是 RetentionPolicy.RUNTIME。这就意味着,编译器会将 Inherited 的信息保留在 .class ⽂件中,并且能
被虚拟机读取。
(04) @Target(ElementType.ANNOTATION_TYPE) -- 它的作⽤是指定 Inherited 的类型是 ANNOTATION_TYPE。这就意味
着,@Inherited 只能被⽤来标注 "Annotation 类型"。
(05) @Inherited 的含义是,它所标注的Annotation将具有继承性。
*/
}
假设,我们定义了某个 Annotaion,它的名称是 MyAnnotation,并且 MyAnnotation 被标注为 @Inherited。现在,某个类 Base 使⽤了MyAnnotation,则 Base 具有了"具有了注解 MyAnnotation";现在,Sub 继承了 Base,由于 MyAnnotation 是 @Inherited的(具有继承性),所以,Sub 也 "具有了注解 MyAnnotation"。
/**
* ⾃定义的Annotation。
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@interface Inheritable {
}
@Inheritable
class InheritableFather {
public InheritableFather() {
// InheritableBase是否具有 Inheritable Annotation
System.out.println("InheritableFather:"+InheritableFather.class.isAnnotationPresent(Inheritable.class));
}
}
/**
* InheritableSon 类只是继承于 InheritableFather,
*/
public class InheritableSon extends InheritableFather {
public InheritableSon() {
super(); // 调⽤⽗类的构造函数
// InheritableSon类是否具有 Inheritable Annotation
System.out.println("InheritableSon:"+InheritableSon.class.isAnnotationPresent(Inheritable.class));
}
public static void main(String[] args) {
InheritableSon is = new InheritableSon();
}
}
运⾏结果:
InheritableFather:true
InheritableSon:true
现在,我们对 InheritableSon.java 进⾏修改:注释掉 "Inheritable 的 @Inherited 注解"。
InheritableFather:true
InheritableSon:false
对⽐上⾯的两个结果,我们发现:当注解 Inheritable 被 @Inherited 标注时,它具有继承性。否则,没有继承性。
1.4 @SuppressWarnings
/*
说明:
(01) @interface -- 它的⽤来修饰 SuppressWarnings,意味着 SuppressWarnings 实现了 java.lang.annotation.Annotation 接⼝;即 SuppressWarnings 就是⼀个注解。
(02) @Retention(RetentionPolicy.SOURCE) -- 它的作⽤是指定 SuppressWarnings 的策略是 RetentionPolicy.SOURCE。这就意味着,SuppressWarnings 信息仅存在于编译器处理期间,编译器处理完之后 SuppressWarnings 就没有作⽤了。
(03) @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) -- 它的作⽤是指定SuppressWarnings 的类型同时包括TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE。
TYPE 意味着,它能标注"类、接⼝(包括注释类型)或枚举声明"。
FIELD 意味着,它能标注"字段声明"。
METHOD 意味着,它能标注"⽅法"。
PARAMETER 意味着,它能标注"参数"。
CONSTRUCTOR 意味着,它能标注"构造⽅法"。
LOCAL_VARIABLE 意味着,它能标注"局部变量"。
(04) String[] value(); 意味着,SuppressWarnings 能指定参数
(05) SuppressWarnings 的作⽤是,让编译器对"它所标注的内容"的某些警告保持静默。
*/
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
例如,"@SuppressWarnings(value={"deprecation", "unchecked"})" 表⽰对"它所标注的内容"中的 "SuppressWarnings 不再建议使⽤警告"和"未检查的转换时的警告"保持沉默。⽰例如下:
/*
SuppressWarnings 常⽤的关键字的表格
deprecation -- 使⽤了不赞成使⽤的类或⽅法时的警告
unchecked -- 执⾏了未检查的转换时的警告,例如当使⽤集合时没有⽤泛型 (Generics) 来指定集合保存的类型。
fallthrough -- 当 Switch 程序块直接通往下⼀种情况⽽没有 Break 时的警告。
path -- 在类路径、源⽂件路径等中有不存在的路径时的警告。
java的tostring方法serial -- 当在可序列化的类上缺少 serialVersionUID 定义时的警告。
finally -- 任何 finally ⼦句不能正常完成时的警告。
all -- 关于以上所有情况的警告。
boxing -- 禁⽌与装箱/拆箱操作相关的警告
cast -- 强制转换以抑制与强制转换操作相关的警告
dep-ann -- ⽤于抑制相对于已弃⽤注释的警告
hiding -- 隐藏以抑制相对于隐藏变量的本地警告
incomplete-switch -- 在switch语句(enum案例)中,incomplete-switch⽤来抑制相对于丢失条⽬的警告
javadoc -- 禁⽌与javadoc警告相关的警告
nls -- 使⽤nls来抑制相对于⾮nls字符串的警告。
null -- 空值来抑制相对于空值分析的警告
rawtypes -- 拒绝与使⽤原始类型相关的警告
resource -- ⽤于抑制与使⽤类型为Closeable的资源相关的警告的资源
restriction --限制禁⽌与使⽤不⿎励或禁⽌引⽤相关的警告
static-access --静态访问,抑制相对于不正确的静态访问的警告
static-method --静态⽅法,⽤于抑制相对于可以声明为静态的⽅法的警告
super -- 超级-来抑制相对于在没有超级调⽤的情况下重写⽅法的警告
synthetic-access-- ⽤于抑制相对于内部类的未优化访问的警告的合成访问
sync-override -- 在覆盖同步⽅法时,由于缺少同步⽽取消警告
unchecked -- 未选中以抑制与未选中操作相关的警告
unqualified-field-access-- 不限定字段访问来抑制与字段访问不限定相关的警告
unused -- 不常⽤来抑制与未使⽤代码和死代码相关的警告
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论