枚举
枚举就是把几个固定的常量列举出来。枚举本质上也是一个类,只不过这个类的对象是几个固定的值,不能让外界创建对象。
public enum Week {
//枚举项表示Week类的对象,带括号表示使用有参数构造方法, 不带括号,表示使用空参数构造方法
SUNDAY("星期日"), MONDAY("星期一"), TUESDAY,WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
private String value; //星期几
//把构造方法私有化,目的就是不让别人创建的对象
private Week() {
}
//把构造方法私有化,目的就是不让别人创建的对象
private Week(String value) {
this.value = value;
}
@Override
public String toString() {
return "Week{" +
"value='" + value + '\'' +
'}';
}
}
枚举类的方法。
public String name()
获取枚举项的名称
public int ordinal()
获取枚举项的索引
public int compareTo(E o)
比较枚举项的顺序
public String toString()
返回枚举项的名称,如果不想要枚举项的名称也可以复写这个方法。
public static T valueOf(Class<T> enumType, String name)
获取枚举项
注解
注解用来给代码添加一些额外的标注,可以写在类上,写在方法上,写在变量上。
- Java的内置注解
@Override: 复写父类方法
@Deprecated: 标记这个方法过时了
@SuppressWarnings: 压制警告
- 自定义注解
//表示注解的存活时间,在运行时有效
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = ElementType.TYPE)
public @interface Anno {
//定义注解的属性,default设置默认值
public String name();
public String methodname();
}
- 使用反射来解析注解
@Anno(name = "com.itheima.Teacher",methodname = "teach")
public class Demo {
public static void main(String[] args) throws Exception {
//获取Demo类的字节码
Class<Demo> clazz = Demo.class;
//获取类上的注解
Anno anno = clazz.getAnnotation(Anno.class);
//获取注解的属性
String classname = anno.name();
String methodname = anno.methodname();
//获取要执行的类的字节码
Class<?> stuClazz = Class.forName(classname);
//通过字节码创建的对象
Object obj = stuClazz.getConstructor().newInstance();
//获取方法
Method method = stuClazz.getMethod(methodname);
//执行方法
method.invoke(obj);
}
}