一、枚举
1.枚举的来由 2.枚举的作用 3.枚举的特点 4.扩展:switch里可以传入哪些类型的值
二、注解
1.作用 2.注解的种类 3.自定义注解 4.通过反射读取并使用注解 5.注解参数的类型
三、Properties
1.什么是properties 2.properties的使用 3.与Java的交互
一、枚举
1.枚举的来由
业务需求(红绿灯):要创建指定个数的指定对象
public class TraLightColor {
// 创建指定个数的指定对象
public static TraLightColor red = new TraLightColor();
public static TraLightColor green = new TraLightColor();
public static TraLightColor yellow = new TraLightColor();
// 构造方法私有化,防止随意new任意多个对象
private TraLightColor(){
}
}
用上述方法过于繁琐,枚举的出现大大简化了创建指定个数对象的代码。
使用枚举:
public enum TraLightColor {
// 创建指定个数的指定对象
red,green,yellow;
}
2.枚举的作用
上述例子很明显,枚举用来解决创建指定个数对象的东西。关键字enum。
3.枚举的特点
- 枚举里可以定义枚举值,类型是当前的枚举类型
- 除了枚举值,枚举里还可以定义 一个类 里可以定义的所有东西
- 构造方法必须是私有化的,如果没有定义会默认一个私有的无参构造
- 构造方法可以重载,可以有参数列表,枚举值需要跟构造方法匹配
- 所有枚举都默认继承Enum类,从而间接继承Object类
- .ordinal() 方法返回当前枚举对象在枚举值列表中的索引位置,从0开始
- .name() 方法返回枚举值对象名
4.扩展:switch里可以传入哪些类型的值
3种整型(byte,short,int)2种字符(char,String)和枚举型。
俗称:3整2符1枚举
二、注解
1.作用
注解是用来对程序进行解释说明。
相比于注释,注解可以实际影响到程序本身(通过反射)。
2.注解的种类
一般注解
注解 | 作用 |
---|---|
@Override | 表示重写 |
@Deprecated | 表示过时的 |
@SuppressWarnings | 抑制警告 |
元注解
注解 | 作用 |
---|---|
@Target | (ElementType) 定义这个当前注解可以修饰哪些内容:方法/类/属性/构造器/临时变量 |
@Retention | (RententionPolicy) 说明此注解生效到哪个阶段:SOURCE 源码阶段/CLASS 字节码阶段/RUNTIME 运行时阶段(常用) |
@Documented | 生成doc说明文档的时候是否显示,有该注解则显示,反之不显示。 |
@Inherited | 此注解是否可以被继承,有则可被继承,反之不可。 |
3.自定义注解
不带参数
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})//注解在什么阶段下生效(source源码阶段、class字节码阶段、runtime运行时阶段) 一般用运行时阶段
@Retention(RetentionPolicy.RUNTIME)
@Documented // 生成doc说明文档时是否显示
@Inherited // 该注解是否可以被继承
public @interface MyAnnotation {
}
带参数
定义:
...
public @interface MyAnnotation {
// 参数类型 参数名
String value();
int age() default 18;
String [] hobby();
}
使用:
@MyAnnotation(value = "张三" ,hobby = {"唱","跳","rap"})
...
1.当有且只有一个参数且名为value时,使用该注解时可以省略 value =
2.若有多个参数,使用时用逗号隔开
3.参数可以用default关键字来定义默认值
4.参数类型也可以为数组,使用时赋值是用{ }
4.通过反射读取并使用注解
// 获取反射类
Class clazz = Person.class;
// 获取属性
Field nameField = clazz.getDeclaredField("name");
// 获取该属性对应的某个注解
MyAnnotation myAnnotation = nameField.getDeclaredAnnotation(MyAnnotion.class);
// 获取注解里配置的参数值
String nameValue = myAnnotation.value();
int age = myAnnotation.age();
String [] hobby = myAnnotation.hobby();
5.注解参数的类型
注解参数的类型 |
---|
基本数据类型(4类8种) |
String |
Class |
枚举 |
注解 |
以上几种类型组成的数组 |
三、Properties
1.什么是properties
Properties 是一种文本格式。里面的数据有自己规定的格式,一般存放键值对类型的数据。
相比于.txt,Properties可以很好很方便的跟java程序进行交互。java提供专门跟properties交互的API。存到properties文件中的内容是可以持久化的。properties
2.properties的使用
注释
注释使用 # 号来表示。
内容
键值对一般使用 = (等号)分割,也可以用 : (冒号)或者 (空格)分割,但是尽量使用等号分割,清晰明了。
3.与Java的交互
数据的读取
// 创建字节输入流对象
File file = new File("day04-02/src/hello.properties");
System.out.println(file.exists());
FileInputStream fis = new FileInputStream(file);
//创建Properties对象,并将输入流的数据载入
Properties p = new Properties();
p.load(fis);
//使用枚举器(Hashtable Vector)遍历输出
Enumeration<Object> keys = p.keys();
while (keys.hasMoreElements()){
String key = (String) keys.nextElement();
System.out.println(key + " = " + p.getProperty(key) );
}
数据的存储
//创建我们要保存的文件对象,如果不存在就创建这个文件
File f = new File("day04-02/src/hello2.properties");
if(!f.exists()){
f.createNewFile();
}
//创建字节输出流对象
FileOutputStream fos = new FileOutputStream(f);
//创建Properties对象,并将要存储的数据传入
Properties p = new Properties();
p.setProperty("name","张三");
p.setProperty("age","18");
p.setProperty("sex","男");
//将Properties对象中的数据通过输出流存储到文件中
p.store(fos,"test");
注意:当既有读取又有存储时,使用完某个流时必须及时关闭,不能混用。
其他
获取资源文件的流我们还可以通过
InputStream fis = Person.class.getClassLoader().getResourceAsStream("hello.properties");
但是这种方式会将数据缓存到虚拟机中,如果缓存有数据则使用,没有则读取文件。