注解Annotation简介,及注解简单应用,数组类型的属性,未完待续---枚举类型的属性,注解类型的属性

本文深入探讨Java注解的使用及自定义注解的创建过程,包括注解的基本概念、应用场景、元注解的使用,以及如何通过反射获取注解信息。



package com.base_super.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Arrays;

/**
 * 注解:JDK1.5的新特性
 * 
 * 总结:
 * 	1:注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具
 * 		和其他程序可以用反射来了解你的类以及各种元素上有无何种标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
 *  2,看java.lang包,可看到JDK中提供的最基本的annotation
 * 
 * @author wjw
 *
 */
//对“应用注解的类”进行反射操作的类
public class AnnotationTest1 {
	public static void main(String[] args) {
//		method();
//		Annotataion_Class.sayHello();//这就是调用过时方法的效果
		method1();
	}
	//以下这两种注解方式都可以
//	@SuppressWarnings(value = { "deprecation" })
	@SuppressWarnings("deprecation")//声明该方法是被废弃的方法,让其不用再显示中划线了,但Myeclipse这个功能实现的不好,还在显示
	public static void method(){
		System.runFinalizersOnExit(true);
	}
	
	public static void method1(){
		//判断应用注解的类是否是应用的ZiDingYi_Annotation_class这个注解
		boolean boo=Annotataion_Class.class.isAnnotationPresent(ZiDingYi_Annotation_class.class);
		if(boo){
			ZiDingYi_Annotation_class zdy=Annotataion_Class.class.getAnnotation(ZiDingYi_Annotation_class.class);
			System.out.println(zdy);
			System.out.println("dddddddddd");
			System.out.println(zdy.color());//调用那个属性方法
			System.out.println(zdy.value());//调用那个属性方法,可以和其他属性一样正常调用
		
//			System.out.println(Arrays.asList(zdy.Arrayarr()));//整形数组不能通过Arrays.asList()方法进行打印,因为int[],不是Object[]
			System.out.println(zdy.Arrayarr().length);//这里就打印数组的长度了
		}
	
	}
	
}
/**
 * 应用注解 的类
 * @author zjw
 *
 */
//@ZiDingYi_Annotation_class//把自定义的注解应用在类上


//@ZiDingYi_Annotation_class(color = "yellow",value="aaaaaaaaaa")//因为注解中添加了属性方法,所以这里也要对属性进行初始化

//@ZiDingYi_Annotation_class(value="aaaaaaaaaa")//因为注解中添加了属性方法,所以这里也要对属性进行初始化
//@ZiDingYi_Annotation_class(value="bbb",Arrayarr={1,2,3,4,5,6})//可以为已经赋值过的属性从新赋值
@ZiDingYi_Annotation_class(value="cc",Arrayarr=888)//如果数组只有一个值的话,可以直接这样写,不用再写大括号了
class Annotataion_Class{
	@Deprecated//该注解表示该方法过时,建议不使用该方法,但该方法还是可以调用
	public static void sayHello(){
		System.out.println("hi,Jack!!!!");
	} 
	@Override
	public String toString(){
		return "@Override这个注解的作用是确保你写的方法是否覆盖了父类的方法";
	}
}
/**
 * 自定义注解类
 * @author zjw
 *
 */

//元信息:信息的信息等等

//这是元注解,就是注解的注解

/**
 * @Retention元注解,三种取值:
 * 		RetetionPolicy.SOURCE---对应-----java源文件				@Override,@SuppressWarnings都应用在这个阶段
 * 		RetetionPolicy.CLASS----对应-----class文件,这是默认的阶段
 * 		RetetionPolicy.RUNTIME--对应-----内存中的字节码			@Deprecated应用在这个阶段								
 * 
 */
@Retention(value = RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})//这样加这个注解,表示让自定义的注解只能应用到相应的位置上去,本次设置,是应用到方法上,和类上,注意ElementType.METHOD表示应用到方法上,ElementType.TYPE表示应用到类
//至于为什么要用type代替class,因为class实现了type接口,且多个类型(如:enum,@interface)等都实现了type接口
@interface ZiDingYi_Annotation_class{
//	String color();//在注解中添加属性方法
	String color() default "blue";//在注解中添加属性方法,并设定默认值,此时的话,就可以认为只有下面的value一个属性赋值,就可以简写了 如:@ZiDingYi_Annotation_class(value="aaaaaaaaaa")
	
	String value();//注意这个属性很特殊,如果只有这个属性需要赋值的话,在添加注解时,可以简写 如:@ZiDingYi_Annotation_class(value="aaaaaaaaaa")

	int[] Arrayarr() default {2,3,4};//定义整形数组属性方法
}


<think>我们正在讨论Java注解属性支持的数据类型以及如何定义数组类型注解属性。 根据之前的知识和引用: 引用[1]提到“注解数组用法则允许我们在一个注解中定义多个值”,因此我们将重点解释数组类型注解属性。 引用[2]和引用[3]提供了注解的基本概念,我们可以基于此展开。 注解属性支持的数据类型包括: 1. 基本数据类型(byte, short, int, long, float, double, char, boolean) 2. String类型 3. Class类型 4. 枚举类型 5. 注解类型 6. 以上类型数组 定义数组类型注解属性: 在注解中定义一个数组类型属性,其语法类似于普通方法,但返回类型数组。 例如: 类型[] 属性名() default 默认值; 其中,默认值是可选的。如果指定默认值,需要使用花括号{}括起来,元素之间用逗号分隔(类似于数组初始化)。 如果没有指定默认值,则使用该注解时必须为该属性赋值。 注意:如果数组只有一个元素,可以省略花括号(但通常建议保留,以保持一致性)。 下面我们将通过示例代码来展示如何定义和使用数组类型注解属性。 </think>### Java 注解属性支持的数据类型数组类型定义详解 #### 一、注解属性支持的数据类型 根据 Java 规范,注解属性支持以下 **8 种数据类型**: 1. **基本数据类型**: `byte`、`short`、`int`、`long`、`float`、`double`、`char`、`boolean` ```java public @interface BasicTypes { int intValue(); boolean boolValue() default true; } ``` 2. **String 类型**: ```java public @interface StringType { String value(); } ``` 3. **Class 类型**: ```java public @interface ClassType { Class<?> targetClass(); } ``` 4. **枚举类型**: ```java enum Status { ACTIVE, INACTIVE } public @interface EnumType { Status status(); } ``` 5. **注解类型**: ```java public @interface NestedAnnotation { BasicTypes nested(); } ``` 6. **以上类型数组**: ```java public @interface ArrayType { int[] scores(); // 基本类型数组 String[] names(); // String 数组 Class<?>[] classes(); // Class 数组 } ``` > **禁止使用的类型**:`Object`、包装类(如`Integer`)、泛型、集合类型等[^1][^2]。 --- #### 二、定义数组类型注解属性 ##### 1. 基础语法 数组属性声明格式: ```java 数据类型[] 属性名() default {默认值}; ``` ##### 2. 完整示例 ```java import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) public @interface CourseInfo { String name(); // 单值属性 String[] teachers(); // 字符串数组(无默认值) int[] scores() default {90}; // 整型数组(带默认值) Day[] days(); // 枚举数组 enum Day { MONDAY, WEDNESDAY, FRIDAY } } ``` ##### 3. 使用示例 赋值时需用 `{}` 包裹数组元素: ```java // 显式赋值所有数组属性 @CourseInfo( name = "Java Programming", teachers = {"Alice", "Bob"}, // 字符串数组赋值 scores = {85, 90, 95}, // 覆盖默认值 days = {Day.MONDAY, Day.FRIDAY} ) public class AdvancedJavaCourse { /*...*/ } // 使用默认值(省略 scores) @CourseInfo( name = "Database", teachers = {"Charlie"}, days = {Day.WEDNESDAY} ) public class DatabaseCourse { /*...*/ } ``` > **特殊规则**: > -数组:`scores = {}` > - 单元素数组:`days = {Day.MONDAY}` 可简写为 `days = Day.MONDAY` --- #### 三、运行时获取数组属性值 通过反射读取数组属性: ```java Class<?> courseClass = AdvancedJavaCourse.class; CourseInfo annotation = courseClass.getAnnotation(CourseInfo.class); // 获取数组属性String[] teachers = annotation.teachers(); int[] scores = annotation.scores(); // 遍历输出 System.out.println("Teachers: " + Arrays.toString(teachers)); System.out.println("Scores: " + Arrays.toString(scores)); ``` **输出结果**: ``` Teachers: [Alice, Bob] Scores: [85, 90, 95] ``` --- ### 数据类型限制原理 Java 注解本质是接口的扩展,其属性实为 **抽象方法**。编译器要求返回值必须是: - 基本类型或 `String` - 可序列化类型(`Class`、枚举、其他注解- 以上类型数组 数组元素需在编译期确定,因此不支持运行时类型(如 `List`)[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

King·Forward

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

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

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

打赏作者

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

抵扣说明:

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

余额充值