Day35
*注解:就是给代码中的方法,属性,参数等贴上了一个标签
-
注解的定义:@interface 注解名字
-
public @interface MyAnno{}
-
用法:在你想要贴上注解的地方的前面加上 @注解名字
-
public class Animals { @MyAnno String name; @MyAnno public void eat() { } @MyAnno public static void main(String[] args) { System.out.println("111"); } } class Cat{ //·注解使用方法:在目标前面加上@注解名称 @MyAnno public void eat() { System.out.println("正常使用"); } }
(当然,这样使用注解是没有任何意义的,就相当于你贴了很多标签,但是标签上面什么都没写。所以java中给了一种注解叫做元注解,用来给自定义的注解加上一些限制)
*元注解:标记在注解上的注解,用以给注解加上某些约定和规则
package com.qianfeng.am.demo1;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//·新建了一个我们自己的注解
//·只能使用默认 和 公共两种修饰符
//·第一种:通过元注解来给自定义的注解规定生命周期
@Retention(RetentionPolicy.SOURCE)//·表明这个自定义的注解只会存在于源代码里面
@Retention(RetentionPolicy.CLASS)//·表明这个自定义的注解只会存在于源代码和编译之后的.CALSS文件里面
@Retention(RetentionPolicy.RUNTIME)//·表明在源码,.class,jvm运行时的时候都有这个注解
//·第二种:规定注解能够标记在那些实体(类,方法,属性等)上面
@Target(ElementType.FIELD)//·表明只能标记在成员属性上
@Target(ElementType.METHOD)//·表明只能标记在方法上
//·第三种:是否生成文档注释
@Documented//·标识这个注解会生成到文档说明里面
//·第四种:注解是否可以被继承
@Inherited//·标识可以被所有的子类继承
public @interface MyAnno {
//·在注解里面定义一个成员变量,当使用这个注解时,就必须给这个成员变量传一个值@MyAnno(name = "jack")
// String name() default "";//·这里加上default的意思就是如果不传值,则默认为""。
String value();//·这里的变量名为value,并且只有这一个成员变量时,则在使用时可以这样传值@MyAnno("jack")
}
*JDK中定义了三种注解:@Override:检查该方法是否是重写方法。
@Depricate :标记过时的方法。
@SuppressWarnings : 指示编译器去忽略注解中声明的警告
*使用反射的方式获取注解:
先自定义一个注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//·只能添加在方法上,整个运行过程中都有这个注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {
}
用反射获取
Class c = Demo.class;
//·获取所有的注解(包括继承的)
Annotation[] at = c.getAnnotations();
//·获取所有的注解(不包括继承的)
Annotation[] at2 = c.getDeclaredAnnotations();
*使用反射的方法调用被上面注解标记过的方法
先随便自定义一个类
public class Demo {
public void eat() {
System.out.println("吃方法");
}
@MyAnno
public void sleep() {
System.out.println("睡方法");
}
@MyAnno
private void run() {
System.out.println("跑方法");
}
}
再用反射获取到这个类的所有方法
Class c = Demo.class;
//·用默认无参构造创建一个对象,调用方法必须要有对象
Demo d = (Demo) c.newInstance();
//·获取到所有方法,并用保存在数组中
Method[] ms = c.getDeclaredMethods();
再用增强循环加上条件语句判断是否被注解标记过
for (Method method : ms) {
//·获取这个方法上面的注解
MyAnno a = method.getAnnotation(MyAnno.class);
//·如果获取到的注解不是空,则说明这个方法有这个注解
if(a != null) {
method.setAccessible(true);
method.invoke(d);
}
}
*Properties配置文件:在配置文件中都是以key值 = value值 进行存储的
对配置文件里的内容进行存取操作:存
public static void main(String[] args) {
String path = "user.properties";
Properties pt = new Properties();
//·写入内容到user.properties中
//·1设置写入的内容
pt.setProperty("aaa", "111");
pt.setProperty("bbb", "222");
pt.setProperty("ccc", "333");
//·设置输出流
try {
FileOutputStream fos = new FileOutputStream(path,true);
pt.store(fos, "这是写入的时候的注释内容");
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
取
public static void main(String[] args) {
//·在配置文件中都是以key值 = value值 进行存储的
String str = "user.properties";
//·创建一个properties对象
Properties p = new Properties();
try {
//·使用一个输入流将user.properties加载到p对象中
p.load(new FileInputStream(str));
//·通过key值 获取value值
String name = p.getProperty("name");
String pass = p.getProperty("pass");
System.out.println("name:"+name);
System.out.println("pass:"+pass);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}