注解(Annotation)

注解

作用:

  • 不是程序本身,可以对程序作出解释.(这一点和注释(comment)没什么区别)
  • 可以被其他程序(比如:编译器等)读取.
内置注解
  1. @Override
  2. @Deprecated
  3. @SuppressWarnings

元注解

元注解的作用就是负责注解其他的注解

  1. @Target

用于描述注解的使用范围(即:被描述的注解可以用在什么地方)

  1. @Retention

表示需要在什么级别保存该注释信息,用于描述注解的生命周期

  1. @Document

说明该注解将被包含在javadoc中

  1. @Inherited

说明子类可以继承父类中的该注解


自定义注解

使用@interface自定义注解时﹐自动继承了java.lang.annotation.Annotation接口

注意事项:

  • @interface用来声明一个注解
  • 其中的每一个方法实际上是声明了一个配置参数.
  • 方法的名称就是参数的名称.
  • 返回值类型就是参数的类型(返回值只能是基本类型,Class , String , enum ).
  • 可以通过default来声明参数的默认值
  • 如果只有一个参数成员,一般参数名为value
  • 注解元素必须要有值﹐我们定义注解元素时﹐经常使用空字符串,0作为默认值.
// 自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})//可以定义在类和方法上
@interface MyAnnotation{
    // 注解的参数:参数类型 + 参数名();
    // 没有默认值要赋值
    String name() default "";
    String id();
    // 如果只有一个参数成员,一般参数名为value
}

public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
    }
    
	//使用自定义注解
    @MyAnnotation(id = "1")
    public void test(){
		System.out.println( "Hello World!" );
    }
}

注解在哪里使用?

可以附加在package , class , method ,field等上面,相当于给他们添加了额外的辅助信息。我们可以通过反射机制编程实现对这些元数据的访问


SpringMVC包扫描和前端路由映射注解值(Servlet)
Controller包下的类
import com.pang.innotation.Controller;
import com.pang.innotation.RequestMapping;


/**
 * 订单控制器
 * 你在浏览器中点击“提交订单”的时候,后台必须有能处理你的请求的类,但是到底哪个类的哪个方法能处理?
 */
@Controller
public class OrderController {

    @RequestMapping(value = "createOrder")
    public void a(String productName){
        System.out.println("订单创建成功: " + productName);
    }

    public void b(){
        System.out.println("帅哥");
    }

}
解析工具类
import com.pang.innotation.Controller;
import com.pang.innotation.RequestMapping;
import junit.framework.TestSuite;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.reflect.MethodUtils;
import org.junit.Test;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ResourceBundle;

public class AnnotationTest extends TestSuite {

    @Test
    public void testAnnotation() {
        String request="createOrder";//相当于点击了“提交订单”,相当于对后台发出了 createOrder请求

        try {
            ResourceBundle bundle = ResourceBundle.getBundle("config");//读取resources下面的config.properties
            String controllerPackageName = bundle.getString("controller.package");
            System.out.println("要扫描的包:" + controllerPackageName);
            /**
             * 把包名转换为路径
             */
            URI uri = AnnotationTest.class.getResource("/" + controllerPackageName.replace(".", "/")).toURI();
            System.out.println(uri.toString());

            File file = new File(uri);

            String controllerClassNames[] = file.list();
            System.out.println(controllerClassNames.length);

            for (String className : controllerClassNames) {
                if (className.endsWith(".class")) {
                    String fullClassName = controllerPackageName + "." + StringUtils.substringBefore(className, ".class");
                    try {
                        Class controllerClass = Class.forName(fullClassName);
                        /*
                        如果clazz中有Controller注解,才进一步处理
                         */
                        if (controllerClass.isAnnotationPresent(Controller.class)) { // 找到标有Controller注解的类
                            Method methods[] = MethodUtils.getMethodsWithAnnotation(controllerClass, RequestMapping.class);
                            /*
                            把注解的信息暂时存储到一个map中,以便在Servlet中收到相应的请求后,找到相应的控制器的方法去处理请求
                             */
                            for (Method method : methods) {
                                RequestMapping annotation = method.getAnnotation(RequestMapping.class);
                                if(annotation.value().equals(request)){ // 拿到RequestMapping的值和前端URL值对比
                                    method.invoke(controllerClass.newInstance(),"鼠标"); //反射调用RoleController下的方法a
                                }
                            }
                        }
                    } catch (IllegalArgumentException e){
                        e.printStackTrace();
                    } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (InstantiationException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    } catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }

        } catch (URISyntaxException e) {
            e.printStackTrace();
        }

    }
}

1.先读取配置文件下的Controller包
2.扫描Controller包下的带有@Controller标注类
3.扫描@Controller标注类下带有@RequestMapping标注方法
4.前端请求路由映射到@RequestMapping的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值