java 1.5 annotation-2

java 1.5 注解-2[非常重要 比每举重要]

刚刚只是说了什么是 注解 ,皮毛都不是

现在要自己弄注解了

就是要 @hubin


注解就相当于一个特殊的类,要用注解
得有人先开发好这个类


要用自己写的 注解 需要写三个类

注解类:
@interface A
{
}

应用了"注解类"的类
@A
class B
{
}

对用了注解类的类 进行反射操作的类
class C{
B.class.isAnnotionPresent(A.class);
A a = B.class.getAnnotion(A.class);
}

----------------------------
package com.ncs.annotation;

public @interface MyAnnotationDemo {
//就把这个注解 用到 AnnotationDemo上看看再说吧
}

------------------------
package com.ncs.annotation;

@MyAnnotationDemo
public class AnnotationDemo {

@SuppressWarnings("deprecation")
public static void main(String[] args) {
System.runFinalizersOnExit(true);
//在ECLIPSE里会画删除线,提示方法过时
//其实在是告诉javac

//写了@SuppressWarnings("deprecation")
//就不警告了
}

@Deprecated
public static void sayHi() {
//总有一天这个方法要过时,
//但是你不敢删除,
//因为N多人在用,你一删人家怎么 compile 呢?
//但是你又想告诉人家 ,这方法过时了,怎么办??
//注解,
System.out.println("hello,zxx");
}
}

-------------------------
package com.ncs.annotation;

public class MyAnnoTest {

public static void main(String[] args) {
//先判断 某个类 有没有 某个 注解
if(AnnotationDemo.class.isAnnotationPresent(MyAnnotationDemo.class)) {
//cun zai de
MyAnnotationDemo myAnnotationDemo = (MyAnnotationDemo)AnnotationDemo.class.getAnnotation(MyAnnotationDemo.class);
System.out.println(myAnnotationDemo);
}
}

}

------------------------------------------
运行后 什么都没有
那肯定是 if 没有成立
修改:
-------------------
package com.ncs.annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotationDemo {
//就把这个注解 用到 AnnotationDemo上看看再说吧
}


------------------------
现在有了
@com.ncs.annotation.MyAnnotationDemo()

要在 注解 类上加 注解 告诉注解 ,你要保持到 运行时哦
注解的注解,元注解
数据的数据,元数据
信息的信息,元信息


@Retention(RetentionPolicy.RUNTIME)
要好好解释上面的一行
我现在是在*.java里写的这行
然后javac把这个compile为 *.class
compile时,会把*.java里的一些东西去了,比如// /**/ comments
@注解也可能会去掉,
所以我们还要告诉 javac ,这个注解要保持到什么时候
如果说不要了,那么等你拿到*.class 就看不到注解了
★即使compile到了*.class 文件
等我们用这个*.class的时候
还需要 classloader 去load 这堆字节码
此时,也会 放弃 一些 东西,不是统统load上来的
load时还会 做些处理,安全检查等....
不是你写个 二进制东西 就可以让 classloader 给你load的

[color=brown]所以注解有三个生命周期

RetetionPolicy.SOURCE ->java 源文件
RetetionPolicy.CLASS ->class文件
RetetionPolicy.RUNTIME ->内存里的字节码

默认值是在class 阶段
所以 刚刚第一次 没有出来什么
是因为 虽然在 *.class里是有的,但是classloader没有加载上来
后来我把它设置为@Retention(RetentionPolicy.RUNTIME)
就加载上来了[/color]

[color=red]---再来看
@Override的生命周期是什么??
应该是 source
只是提示你有没有覆盖,变成class文件以后,这个就没有用了

@SuppressWarning
也是在 source

@Deprecated
要在runtime阶段
--------好好想想[/color]

-------------
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
上面行表示这可以加在 方法前,你写在类前 compiler都反对

如果希望可以出现在 类 , 方法 上
可以这样写:
@Target({ElementType.METHOD,ElementType.TYPE})
现在都可以,看清楚是TYPE,而不是CLASS
为什么呢??

Type 是 class的爸爸,
1.5后,有每举,有注释,有接口...都是 类
他们和类都是兄弟关系,类不大了,
最大的是type了
Interface Type 也是1.5 新出的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值