枚举与注解


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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值