千峰JAVA逆战班Day35

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();
		}
		
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值