88 java反射_4 _注解

文章目录??枚举????枚举的本质????枚举与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.javapackage 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.javapackage 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();}

人,都有不能称心如意的时候,都有愿望落空的窘迫,

88 java反射_4 _注解

相关文章:

你感兴趣的文章:

标签云: