当前位置 : 主页 > 编程语言 > java >

88 java反射_4 _注解

来源:互联网 收集:自由互联 发布时间:2022-07-13
文章目录 ​​枚举​​ ​​枚举的本质​​ ​​枚举与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:指定注解用于修饰类的哪个成员
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();
}


【文章转自:香港多IP服务器 http://www.558idc.com/hkzq.html提供,感恩】
上一篇:91 java8新特性_2 _lambda表达式
下一篇:没有了
网友评论