注解

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

其实不然,如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()需要测试

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

你可能感兴趣的:(注解)