原来一直认为注解的作用就是为了提高代码的阅读性。
其实不然,如Xdoclet可以快速的生成程序的配置文件。
这个是struts的一个例子:
import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; /** * Simple class to test Jakarta Struts generation (Jakarta Struts 1.2 beta 2 only). * * @struts.action * path="/struts/foo" * * @struts.action-forward * name="success" * path="/struts/getAll.do" * redirect="false" */ public final class StrutsAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { return mapping.findForward("success"); } }
<!-- ========== Action Mapping Definitions =================================== --> <action-mappings> <action path="/struts/foo" type="test.web.StrutsAction" unknown="false" validate="true" > <forward name="success" path="/struts/getAll.do" redirect="false" /> </action>
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
JDK5.0注解可以看成是Javadoc标签和Xdoclet的延伸和发展。
它可以自定义标签,通过java的反射机制来获取注解的信息,来完成某些工作。
基本原则:注解不能直接干扰程序代码的运行,无论增加或删除注解,代码都能够正常运行。Java语言解释器会忽略这些注解,而由第三方工具负责对注解进行处理。第三方工具可以利用代码中的注解间接控制程序代码的运行,它们通过Java反射机制读取注解的信息,并根据这些信息更改目标程序的逻辑。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
简单的注解例子:
package com.boventech.learning.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) //①声明注解的保留期限 @Target(ElementType.METHOD)//②声明可以使用该注解的目标类型 public @interface NeedTest {//③定义注解 boolean value() default true;//④声明注解成员 }
package com.boventech.learning.annotation; 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); } }
package com.boventech.learning.annotation; 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() + "()不需要测试"); } } } } }
输出结果:
2
deleteTopic()不需要测试
deleteForum()需要测试
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------