单例设计模式:
核心思想:确保类的实例只有一个
好处:可以节省内存空间,方便控制资源的使用
实现思路:
1.构造方法私有化--阻止外部直接调用本类的构造方法创建对象
2.创建本类对象且私有化--为了防止外部多次获取本类对象
3.对外提供一个公共的全局访问点--按照我们预先设定的方式来获取对象
@Target 注解用在哪里:类上、方法上、属性上等等
@Retention 注解的生命周期:源文件、字节码文件中、运行中
SOURCE在源文件中有效(即源文件保留)
CLASS在class文件中有效(即class保留)
RUNTIME在运行时有效(即运行时保留)
反射要用到的API:
Class.forName("类的全路径")
类名.class
对象.getClass();
package cn.tedu.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*本类用于测试自定义注解,熟悉注解 相关的规则*/
public class TestAnnotation {
}
/*0.首先注意:自定义注解的语法与java不同,不要套用java的格式*/
/*1.注解定义要使用“@interface注解名的方式来定义”*/
/*1.1需要通过@Target注解来描述当前自定义注解可以使用的位置*/
/*注意@Target注解使用的时候需要导包
* 它的值通过“ElementType.静态常量”来指定
* 如果需要指定多个值,可以使用{ ,}的格式来写*/
@Target({ElementType.METHOD,ElementType.FIELD,ElementType.TYPE})
/*1.2通过@Retention注解表明此自定义注解的生命周期
* 注意:@Retention使用时也需要导包
* 它的值通过“RetentionPolicy.静态常量”来指定
* 也就是自定义注解可以存活多久:源文件中/字节码文件中/运行时
* 而且,这三个值只能选一个,不能写多个*/
@Retention(RetentionPolicy.SOURCE)
//1.定义自定义注解,注解名为Test,并指定此注解作用的位置
@interface Test{
/*3.自定义注解可以添加功能--给自定义注解添加属性
* 注意:int age();不是方法的定义,而是自定义注解中定义age属性的语法*/
/*如果为了使用方便,还可以给属性指定默认值,这样注解就可以不赋值直接使用
* int age()default 0;*/
int age()default 0;
/*4.注解中还可以添加功能,可以定义特殊属性value
* 特殊属性的定义于其他普通属性的定义相同,主要是使用方式不同
* 使用此注解时,属性赋值不再需要写属性名,直接写值就可以
* 也就是说:@Test(value = "apple")可以简写成@Test("apple")
* 但是自定义注解中的特殊属性赋予默认值时的格式不能简写
* 如果给特殊属性赋予了默认值,使用时可以不赋值,使用默认值即可*/
//4.给注解定义一个特殊属性value
String value()default "lemon";
}
/*2.使用注解时,只要在自定义注解名字前加@符号即可使用此注解*/
//2.定义一个类来测试自定义注解
//@Test
class TestAnno{
/*测试一:分别给TestAnno类/name属性/eat方法都添加了@Test注解,只有方法上不报错
* 结论:自定义注解能够加在什么位置,取决于@Target注解的值*/
/*测试二:修改@Target注解的值:
* @Target({ElementType.METHOD,ElementType.FIELD,ElementType.TYPE})
* 结论:@Test可以存在于多个位置,如果有多个值,格式为{ ,}
* 原因:Target注解的源码:ElementType[] value();*/
//@Test
String name;
/*测试三:当我们添加了注解的age属性后,@Test注解报错
* 结论:当没有给自定义注解定义属性时,可以直接使用但是如果有属性了,必须给属性赋值
* 测试四:给@Test注解的属性赋值以后,就不报错了
* 结论:给属性赋值的格式“@Test(age = 18)”,注意不能直接写值,这是错误的格式
* 测试五:给age属性赋值以后,可以不加属性值直接使用注解
* 此时使用的属性值是age的默认值*/
//@Test(age = 18)
//@Test(value = "apple")
/*测试六:给特殊属性value赋值时可以简写,相当于value=“apple”*/
/*测试七:因为两个属性均被设置为默认值,所以无需赋值,可以使用@Test注解*/
//@Test("apple")
@Test
public void eat(){
System.out.println("点个奶茶吧,加冰淇淋");
}
}