title: 枚举与注解
枚举
1. 枚举类
-
关键字:enum
-
拥有的对象是固定的几个值
-
枚举类中的值类型就是枚举类的类型,是公开静态常量
-
枚举中的默认构造方法是私有的,不允许在类外部调用构造方法
-
枚举类中自己写构造方法时也不允许写公开的构造方法
-
Enum默认是所有枚举类的父类
-
枚举类中可以由抽象方法,但是枚举值要采用匿名内部类实现抽象方法
public class TestEnum {
public static void main(String[] args) {
Order order = new Order();
order.status = State.SENT;
}
}
class Order{
public State status = State.UNPAY;
}
enum State{
UNPAY,
PAYED,
SENT,
RECEIVED
}
//这个枚举类相当于
class State2{
public static final State2 UNPAY = new State2();
public static final State2 PAYED = new State2();
public static final State2 SENT = new State2();
public static final State2 RECEIVED = new State2();
private State2() {}
}
//若自己重写了枚举类中的构造方法
enum State{
UNPAY("未支付"),
PAYED("已支付"),
SENT("已发货"),
RECEIVED("已收货");
private State(String s) {}
}
//这个枚举类相当于
class State2{
public static final State2 UNPAY = new State2("未支付");
public static final State2 PAYED = new State2("已支付");
public static final State2 SENT = new State2("已发货");
public static final State2 RECEIVED = new State2("已收货");
private State2() {}
private State2(String s) {}
}
//枚举的一些小细节
State[] states = State.values();
for(State s : states) {
System.out.println(s.name()+";;"+s.getComment()+";;"+s.ordinal());
}
enum State{
UNPAY("未支付"),
PAYED("已支付"),
SENT("已发货"),
RECEIVED("已收货");
private String comment;
private State(String s) {
comment = s;
}
public String getComment() {
return comment;
}
}
标注
1.标记标注
- 没有属性,@标注名
2.单值标注
-
一个属性,@标注名(属性名=属性值)
-
如果属性名位value,@标注名(value = 属性值),可以直接写成 @标注名(属性值)
3.多值标注
- 多个属性,@标注名(属性名1=属性值1,。。。)
自定义标注
1.元标注
-
Target:描述标注可以为那些程序组件添加此标注(类,属性,构造方法,方法)
-
Retention: 描述标注信息保留到什么时候
- 属性类型:必须是具有字面值的类型,8种基本类型,String,Enum,Class,以及他们的数组
import java.lang.annotation.*; import java.lang.reflect.Method; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.*; public class TestAnnotation { public static void main(String[] args) { //利用反射获得类对象,得到类中所有的方法 Class c = MyClass.class; Method[] ms = c.getMethods(); for(Method m : ms) { if(m.isAnnotationPresent(Test.class)) { //如果用的是这样的注释,返回注释对象 Test t = m.getAnnotation(Test.class); String v1 = t.value(); int v2 = t.value2(); System.out.println(m.getName()); System.out.println(v1+" "+v2); } } } } class MyClass{ int a; public MyClass() {} @Test public void method1(){} public void method2(){} } @Target({METHOD}) //元标注 @Retention(RUNTIME) @interface Test{ //给属性赋默认值 String value() default "wangpeng"; int value2() default 10; }
自定义标注的案例
package com.enumtest;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.TreeMap;
import java.lang.annotation.Retention;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
//自动测试
public class AutoTestEngine {
public static void main(String[] args) throws Exception{
autoTest("com.enumtest.ClassA");
}
//根据className自动创建对象,斌不过按照Test标注顺序,用相应的参数,执行每个需亚奥测试的方法
public static void autoTest(String className) throws Exception{
//利用反射创建对象
Class c = Class.forName(className);
Object o = c.newInstance();
//利用TreeMap key:Integer,value:Method,TreeMap会自动排序
TreeMap<Integer,Method> map = new TreeMap<>();
//拿到c类中所有的公开方法
Method[] ms = c.getMethods();
//遍历ms数组,将数组中元素放入TreeMap数组中
for(Method m : ms) {
//判断该方法的标注是不是AutoTest
if(m.isAnnotationPresent(AutoTest.class)) {
//拿到添加了AutoTest标注的方法中的order属性
AutoTest t = m.getAnnotation(AutoTest.class);
int order = t.order();
//放入TreeMap中
map.put(order,m);
}
}
//遍历TreeMap的值,依次调用每个方法
Collection<Method> values = map.values();
for(Method m : values) {
//拿到AutoTest对象
AutoTest t = m.getAnnotation(AutoTest.class);
//获取AutoTest中的parameter对象
String p = t.parameter();
Object result = m.invoke(o, p);
System.out.println(result);
// System.out.print(o.toString());
// System.out.println(p);
}
}
}
class ClassA{
@AutoTest(order = 2,parameter = "zhang")
public String ma(String s) {
return "ma "+s;
}
@AutoTest(order = 1,parameter = "wang")
public String mb(String s) {
return "mb "+s;
}
@AutoTest(order = 3,parameter = "li")
public String mc(String s) {
return "mc "+s;
}
@AutoTest(order = 4,parameter = "zhao")
public String md(String s) {
return "md "+s;
}
public String me(String s) {
return "me "+s;
}
}
@Target(METHOD)
@Retention(RUNTIME)
@interface AutoTest{
int order();
String parameter();
}