引用
很多东西的设计都必须遵循最基本的原则,为了防止机器人伤害人类,科幻作家阿西莫夫于1940年提出了“机器人三原则”:第一,机器人不能伤害人类;第二,机器人应遵守人类的命令,与第一条违背的命令除外;第三,机器人应能保护自己,与第一条违背的命令除外。这是给机器人赋予的伦理性纲领,机器人学术界一直将这三条原则作为机器人开发的准则。
一个简单的注解类 通常情况下,第三方工具不但负责处理特定的注解,本身还提供了这些注解的定义,所以我们通常仅需关注如何使用注解就可以了。但定义注解类本身并不困难,Java提供了定义注解的语法。下面,我们马上着手编写一个简单的注解类,如代码清单7-1所示: 代码清单7-1 NeedTest注解类 Java代码
- package com.baobaotao.aspectj.anno;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- @Retention(RetentionPolicy.RUNTIME) //①声明注解的保留期限
- (ElementType.METHOD)//②声明可以使用该注解的目标类型
- public NeedTest { //③定义注解
- boolean value() default true;//④声明注解成员
- }
- 成员以无入参无抛出异常的方式声明,如boolean value(String str)、boolean value() throws Exception等方式是非法的;
- 可以通过default为成员指定一个默认值,如String level() default "LOW_LEVEL"、int high() default 2是合法的,当然也可以不指定默认值;
- 成员类型是受限的,合法的类型包括原始类型及其封装类、String、Class、enums、注解类型,以及上述类型的数组类型。如ForumService value()、List foo()是非法的。
- SOURCE:注解信息仅保留在目标类代码的源码文件中,但对应的字节码文件将不再保留;
- CLASS:注解信息将进入目标类代码的字节码文件中,但类加载器加载字节码文件时不会将注解加载到JVM中,也即运行期不能获取注解信息;
- RUNTIME:注解信息在目标类加载到JVM后依然保留,在运行期可以通过反射机制读取类中注解信息。 Target(ElementType.METHOD)表示NeedTest这个注解只能应用到目标类的方法上,注解的应用目标在java.lang.annotation.ElementType类中定义:
- TYPE:类、接口、注解类、Enum声明处,相应的注解称为类型注解;
- FIELD:类成员变量或常量声明处,相应的注解称为域值注解;
- METHOD:方法声明处,相应的注解称为方法注解;
- PARAMETER:参数声明处,相应的注解称为参数注解;
- CONSTRUCTOR:构造函数声明处,相应的注解称为构造函数注解;
- LOCAL_VARIABLE:局部变量声明处,相应的注解称为局域变量注解;
- ANNOTATION_TYPE:注解类声明处,相应的注解称为注解类注解,ElementType. TYPE包括ElementType.ANNOTATION_TYPE;
- PACKAGE:包声明处,相应的注解称为包注解。
Java代码
- package com.baobaotao.aspectj.anno;
- public class ForumService {
- @NeedTest(value=true) ①
- public void deleteForum(int forumId){
- System.out.println("删除论坛模块:"+forumId);
- }
- @NeedTest(value=false) ②
- public void deleteTopic(int postId){
- System.out.println("删除论坛主题:"+postId);
- }
- }
引用
@<注解名>(<成员名1>=<成员值1>,<成员名1>=<成员值1>,...)
如果成员是数组类型,可以通过 {} 进行赋值,如boolean数组的成员可以设置为{true,false,true}。下面是几个注解标注的例子: 示例1,多成员的注解: Java代码
- @AnnoExample(id= 2868724, synopsis = "Enable time-travel",
- engineer = "Mr. Peabody",date = "4/1/2007")
Java代码
- ("2011 bookegou.com All Right Reserved")
Java代码
- @Override
Java代码
- @SuppressWarnings(value={ "unchecked","fallthrough"})
Java代码
- @Reviews({ @Review(grade=Review.Grade.EXCELLENT,reviewer="df"),
- @Review(grade=Review.Grade.UNSATISFACTORY,reviewer="eg",
- comment="This method needs an @Override annotation")})
Java代码
- package com.baobaotao.aspectj.anno;
- import java.lang.reflect.Method;
- public class TestTool {
- public static void main(String[] args) {
- //①得到ForumService对应的Class对象
- Class clazz = ForumService.class;
- //②得到ForumSerivce对应的Method数组
- Method[] methods = clazz.getDeclaredMethods();
- System.out.println(methods.length);
- for (Method method : methods) {
- //③获取方法上所标注的注解对象
- NeedTest nt = method.getAnnotation(NeedTest. class);
- if (nt != null) {
- if (nt.value()) {
- System.out.println(method.getName() + "()需要测试");
- } else {
- System.out.println(method.getName() + "()不需要测试");
- }
- }
- }
- }
- }
引用
deleteForum()需要测试 deleteTopic()不需要测试