88 java反射_4 _注解

枚举

  • 什么是枚举:
    • 枚举是一个引用类型,枚举是一个规定了取值范围的数据类型。
    • 枚举变量不能使用其他的数据,只能使用枚举中常量赋值,提高程序安全性。
    • 定义枚举使用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:指定注解用于修饰类的哪个成员

package com.wlw.chapter12_reflex.demo05_annotation;

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();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悬浮海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值