注解+枚举
一、枚举
-
枚举定义?
枚举:enumeration 关键字enum,表示一些程序中的固定值,是Java5.0之后提出的类型。
枚举就是把程序中固定的值列举出来。
-
创建枚举?
//和类对照着看 //枚举本身不是类,但是我们可以看作是一个类来使用 class A{ } //枚举最大得特征就是属性全部大写 enum A{ RED,YELLOW,GREEN; }
-
枚举的使用?
-
枚举传入switch case中
@Test public void testEnum(){ System.out.println(Color.RED); Color c = Color.RED; switch (c){ case GREEN: System.out.println("绿灯");break; case RED: System.out.println("红灯");break; case YELLOW: System.out.println("黄灯");break; } System.out.println(Color.valueOf("RED")==Color.RED); System.out.println(Color.values()[0]+"\t"+Color.values()[1]+"\t"+Color.values()[2]); Color.RED.show(); }
-
valueOf(“”):把字符串转换对应的枚举类型
-
values()[0]:把枚举的值搞成数组的形式,并且返回第一位上的
-
枚举是列举所有可能性,外部不能再new了,因为枚举的构造方法是private修饰的
-
枚举中的属性,类型是枚举本身 修饰符public static final
-
另外枚举的toString()方法重写了,直接打印枚举属性 得到的是字符串
-
-
枚举的应用?
-
框架一样,只是个别属性不一样的,可以封装成枚举的样子
package com.etoak.enums; public enum Teacher { WL("二爷","易途COREJAVA讲师","人气颇高的美女讲师,授课严谨细致、脉络清晰,讲解声情并茂,善于拓展延伸,亲和力强,对待教学认真负责,要求严格,循循善诱,平易近人,不厌其烦,细心讲解,经验丰富,深入浅出,逻辑性强,善于总结归纳重点和难点。负责Java核心技术的教学,是无数易途学员的启蒙老师") , QP("薄老师","DB","四年开发经验,曾在胜利油田项目中负责数据库迁移,并在中国移动旗下咪咕阅读参与数据库方案设计,数据实时推送,还在建筑,金融,电商,智能警务等多个行业积累了Oracle丰富的实战经验,并将整个课程都与现实工作紧密结合起来,负责Oracle数据库教学。"); private String name; private String title; private String info; Teacher(String name, String title, String info) { this.name = name; this.title = title; this.info = info; } public String getName() { return name; } public String getTitle() { return title; } public String getInfo() { return info; } }
-
还可以用在组装响应内容上
/* 响应返回的样子 * { * code:200 50900 * msg:"", * data:{} * * class ETResponse{ * int code; * String msg; * Object data; * setter/getter * } 定义枚举 列举出所有可能性 * enum ETStatus{ * SUCCESS(200,"invoke success"),FAIL(300,"invoke fail"), * SERVER_ERROR(500,"server error"); * int code; * String msg; * private ETStatus(int code,String msg){ * this.code = code; * this.msg = msg; * * } * getter.. *} * StudentController{ * public ETResponse queryAllSchs(){ * List<School> schs = n.... ETResponse response = new ETResponse(); response.setCode(SUCCESS/FAIL/ERROR/..)200 resposne.setCode(ETStatus.SUCCESS.getCode()) response.setMsg() response.setData(变化); * } * } * }
-
二、注解
-
注解简介?
- 注解 Annotation 创建时使用的关键字 @interface
- 一般写在:类上、属性上、方法上、参数上
- 注解包括:注解类型本身和响应的处理程序
-
目前见过的注解?
-
Mybatis
@Parm:出来方法参数中 给组装的map设置key的名字
@Alias:给类起别名
-
Servlet
@WebServlet:热部署
@WebFIlter:过滤器
@WebListener:监听器
-
Spring
-
创建对象的:
@Component、@Controller、@Service、@Repository
-
给属性赋值的:
@Autowired + @Qulifier @Resource @Value
-
@Configration @ConponentScan
-
@RequstMapping(拦截请求)、@ResponseBody(把响应内容组装成json格式)
-
-
Junit
@Test:单元测试的
-
-
来自Java.lang.annotation包下的注解
以下几个注解是给注解使用的,加载注解上面的
1. @Target:表示注解可以用在哪些程序元素上 //这里就是枚举 value=ElementType.METHOD 方法 =ElementType.FIELD 属性 =ElementType.TYPE 其他类、接口 =ElementType.PARAMETER 参数 2. @Retention:注解的保留策略 一般注解写在源码中 编译之后保存到class文件中,但是运行期间,JVM加载类时,会把注解信息擦除 value=RetentionPolicy.SOURCE 保存在源码中(.java文件) =RetetnionPolicy.CLASS class文件 默认的 =RetentionPolicy.RUNTIME 运行时加载 3. @Document:是否把注解信息生成到API文档中 4. @Override:重写注解,此注解的保留策略必然是SOURCE 因为它只是在编译时检查是否完成重写,编译之后不需要存在了
-
自定义注解?
public @interface Etoak{ //注解中的属性 default给默认值 Stirng value() default ""; } //使用时 1. value属性 @Etoak("haha") 此处就是给value属性赋值 value可以省略:如果注解属性名字是value,则在使用注解给value赋值时 可以省略value 2. 注解中可以放枚举 RequestMethod.GET:枚举,表示可以接收什么请求 可以是个数组 表示接收多个请求 @RequstMapping(value="query",method={ RequestMethod.GET,RequestMethod.POST}) 3. 注解中可以放注解 @WebServlet(value="/stu",name="xxx", initParams ={ @WebInitParam(name="ContextConfigLocation", value="/WEB-INF/applicationContext.xml")} ) initParams属性,放置的servlet初始化参数 相当于: <servlet> <servlet-name>xxx</servlet-name> <servlet-class>Test</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>xxx</servlet-name> <url-pattern>/stu</url-pattern> </servlet-mapping>
-
手写Junit测试类
Junit单元测试的原理:
当我们在在某个方法上加上@Test时 会触发一个main方法 也就是说@Test注解中包含了一个main方法
步骤:
-
首先要先获得当前类的Class对象 .class
-
然后 获得这个Class对象的所有方法 cls.getDeclaredMethods()
-
获得所有方法上的注解 getDeclaredAnnotations
需要用到关于注解的注解 就是上述来自java.lang.annotation包中的注解
加上@Retention(RUNTIME) 把保留策略设置成在运行期
-
去判断注解是不是自定义的注解,如果时就调用invoke(new XXX())即可
这里的new XXX() 表示创建带有main方法的对象
public static void main(String[] args) throws Exception{ //main Class cls = Test.class; Annotation [] ans = cls.getDeclaredAnnotations(); for(Annotation an:ans){ if(an.annotationType()==Etoak.class){ //1.created Object obj = cls.newInstance(); //2.init Method[] ms = cls.getDeclaredMethods(); for(Method m:ms){ Annotation[] as = m.getDeclaredAnnotations(); for(Annotation a:as){ if(a.annotationType() ==PostConstruct.class){ m.invoke(obj); } //doSth.. if(a.annotationType()==PreDestroy.class){ m.invoke(obj); } } } } }
-