文章目录 枚举 枚举的本质 枚举与Switch配合使用 注解 定义注解 注解属性类型 注解的本质 反射获取注解信息
文章目录
- 枚举
- 枚举的本质
- 枚举与Switch配合使用
- 注解
- 定义注解
- 注解属性类型
- 注解的本质
- 反射获取注解信息
- 元注解
枚举
- 什么是枚举:
- 枚举是一个引用类型,枚举是一个规定了取值范围的数据类型。
- 枚举变量不能使用其他的数据,只能使用枚举中常量赋值,提高程序安全性。
- 定义枚举使用Jenum关键字
代码:
package com.wlw.chapter12_reflex.demo04_enum;/**
* 性别枚举:
* 注意
* (1)枚举中必须包含枚举常量,也可以包含属性.方法。私有构造方法
* (2)枚举常量必须在前面,多个常量之间使用逗号隔开。最后分号可写可不写
*/
public enum Gender {
MALE,FEMALE;
private String name;
private Gender(){}
public void show(){}
public static void shouw(){}
}package com.wlw.chapter12_reflex.demo04_enum;
public class TestGender {
public static void main(String[] args) {
Gender gender = Gender.MALE;
System.out.println(gender.toString());//MALE
}
}
枚举的本质
- 枚举是一个终止类,继承了Enum抽象类
- 枚举中常量是当前类型的静态常量
代码:
package com.wlw.chapter12_reflex.demo04_enum;//季节枚举
public enum Season {
SPRING,SUMMER,AUTUMN,WINTER;
}package com.wlw.chapter12_reflex.demo04_enum;
public class Test {
public static void main(String[] args) {
Season spring = Season.SPRING;
System.out.println(spring.toString()); //SPRING
}
}
Season.java对应的Season.class文件
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.// Jad home page: http://kpdus.tripod.com/jad.html
// Decompiler options: packimports(3) fieldsfirst ansi space
// Source File Name: Season.java
package com.wlw.chapter12_reflex.demo04_enum;
public final class Season extends Enum
{
public static final Season SPRING;
public static final Season SUMMER;
public static final Season AUTUMN;
public static final Season WINTER;
private static final Season $VALUES[];
public static Season[] values()
{
return (Season[])$VALUES.clone();
}
public static Season valueOf(String name)
{
return (Season)Enum.valueOf(com/wlw/chapter12_reflex/demo04_enum/Season, name);
}
private Season(String s, int i)
{
super(s, i);
}
static
{
SPRING = new Season("SPRING", 0);
SUMMER = new Season("SUMMER", 1);
AUTUMN = new Season("AUTUMN", 2);
WINTER = new Season("WINTER", 3);
$VALUES = (new Season[] {
SPRING, SUMMER, AUTUMN, WINTER
});
}
}
枚举与Switch配合使用
package com.wlw.chapter12_reflex.demo04_enum;public class Demo01 {
public static void main(String[] args) {
Season season = Season.WINTER;
switch (season){ //byte short int char String 枚举(不能是long)
case SPRING:
System.out.println("春天");
break;
case SUMMER:
System.out.println("夏天");
break;
case AUTUMN:
System.out.println("秋天");
break;
case WINTER:
System.out.println("冬天");
break;
default:
break;
}
}
}
注解
- 什么是注解:
- 注解(Annotation)是代码里的特殊标记,程序可以读取注解,一般用于替代配置文件。
- 开发人员可以通过注解告诉类如何运行。
- 在Java技术里注解的典型应用是:可以通过反射技术去得到类里面的注解,以决定怎么去运行类。
- 常见注解: @Override(重写)、 @Deprecated(过时)
- 定义注解使用@interface关键字,注解中只能包含属性。
定义注解
package com.wlw.chapter12_reflex.demo_annotation;/**
* 创建注解类型 @interface
*/
public @interface MyAnnotation {
//属性(类似方法)
//可以有默认属性
String name() default "张三";
int age() default 20;
}package com.wlw.chapter12_reflex.demo_annotation;
public class Person {
@MyAnnotation() //里面不写值的话,就是使用默认属性
public void show(){
}
}
注解属性类型
- 注解属性类型:
- String类型
- 基本数据类型
- Class类型
- 枚举类型
- 注解类型
- 以上类型的一维数组
代码:
package com.wlw.chapter12_reflex.demo_annotation;import com.wlw.chapter12_reflex.demo04_enum.Gender;
public @interface MyAnnotation2 {
//- String类型
String value();
//- 基本数据类型
int age() default 20;
//- Class类型
Class<?> class1();
//- 枚举类型
Gender gender();
//- 注解类型
MyAnnotation myAnnotation();
}
注解的本质
本质是一个接口,并且继承了 Annotation类
class文件:
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.// Jad home page: http://kpdus.tripod.com/jad.html
// Decompiler options: packimports(3) fieldsfirst ansi space
// Source File Name: MyAnnotation.java
package com.wlw.chapter12_reflex.demo05_annotation;
import java.lang.annotation.Annotation;
public interface MyAnnotation
extends Annotation
{
public abstract String name();
public abstract int age();
}
反射获取注解信息
package com.wlw.chapter12_reflex.demo05_annotation;import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(value = RetentionPolicy.RUNTIME)//元注解:用来描述注解的注解。(描述注解的保留范围)
public @interface PersonInfo {
String name();
int age();
String sex();
}package com.wlw.chapter12_reflex.demo05_annotation;
import com.wlw.chapter12_reflex.demo04_enum.Gender;
public class Person {
@MyAnnotation() //里面不写值的话,就是使用默认属性
public void show(){}
//@MyAnnotation2(value = "大肉", class1 = Person.class, gender = Gender.MALE, myAnnotation = @MyAnnotation)
public void eat(){}
@PersonInfo(name="小岳岳",age=20,sex="男")
public void show(String name,int age,String sex){
System.out.println(name+"==="+age+"==="+sex);
}
}package com.wlw.chapter12_reflex.demo05_annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class Demo {
public static void main(String[] args) throws Exception{
//1.获取类对象
Class<?> class1 = Class.forName("com.wlw.chapter12_reflex.demo05_annotation.Person");
//2.获取方法
Method showMethod = class1.getMethod("show", String.class, int.class, String.class);
//3.获取方法上面的注解
PersonInfo personInfo = showMethod.getAnnotation(PersonInfo.class);
//4.打印注解信息
System.out.println(personInfo.name());
System.out.println(personInfo.age());
System.out.println(personInfo.sex());
//5.调用方法
Person yueyue = (Person) class1.newInstance();
showMethod.invoke(yueyue,personInfo.name(),personInfo.age(),personInfo.sex());
}
}
/*执行结果:
小岳岳
20
男
小岳岳===20===男
*/
元注解
元注解:用来描述注解的注解。(描述注解的保留范围)
- @Retention:用于指定注解可以保留的域。
- RetentionPolicy. CLASS:注解记录在class文件中,运行Java程序时,JVM不 会保留。这是默认值
- RetentionPolicy. RUNTIME:注解记录在class文件中, 运行Java程序时,JVM会 保留注,程序可以通过反射获取该注释
- Retent ionPolicy. SOURCE:编译时直接丢弃这种策略的注释
- @Target:指定注解用于修饰类的哪个成员
import com.sun.org.apache.xml.internal.serialize.ElementState;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
@Retention(value = RetentionPolicy.RUNTIME)//元注解:用来描述注解的注解。(描述注解的保留范围)
@Target(value = {ElementType.METHOD})//表明这个注解只能加载方法上面,其他的地方会报错,如果不写这个注解表示所有地方都可以
public @interface PersonInfo {
String name();
int age();
String sex();
}