注解

来源:互联网 发布:mac装好windows没wifi 编辑:程序博客网 时间:2024/06/02 01:58

原来一直认为注解的作用就是为了提高代码的阅读性。

其实不然,如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");    }}

执行完后会生成一个struts-config配置文件:

<!-- ========== 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>

试想想,struts的配置文件一大堆,需要大量的手工操作。而如果写代码的时候将相关的元数据信息写在注释里。Xdoclet自动完成这些任务。将大大提高工作效率。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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()需要测试

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

0 0
原创粉丝点击