Java注解和反射
注解:
-
Annotation是JDK5.0开始引入的新技术
-
可以附加在package、class、method、field等上面,相当于给他们添加了额外的辅助信息
-
通过反射机制变成实现对这些元数据的控制
内置注解
-
@Override:定义在
java.lang.Override
中,此注释只适用于修饰方法,表示一个方法声明打算重写超类中的另一个方法声明 -
@Deprecated:定义在
java.lang.Deprecated
中,此注释可以用于修饰方法,属性,类,表示不鼓励程序员使用这样的元素,通常是因为它很危险,或者存在更好的选择 -
@SuppressWarnings:定义在
java.lang.SuppressWarnings
中,用来抑制编译时的警告信息,与前面的两个注释不同,你需要额外添加一个参数才能正确使用,这些参数都是已经定义好了的,我们选择性的使用就好了。 -
@SuppressWarnings(“all”)
-
@SuppressWarnings(“unchecked”)
-
@SuppressWarnings(value={“unchecked”, “deprecation”})
元注解
元注解的作用就是负责注解其它注解,Java定义了4个标准的meta-annotation类型,他们被用来提供对其它annotation类型作说明。
这些类型和它们所支持的类在 java.lang.annotation
包可以找到 @Target
、@Retention
、@Documented
、@Inherited
-
@Target:用于描述注解的使用范围,即:被描述的注解可以在什么地方使用
-
@Retention:表示需要什么保存该注释信息,用于描述注解的生命周期
-
级别范围:Source < Class < Runtime
-
@Document:说明该注解被包含在java doc中
-
@Inherited:说明子类可以集成父类中的注解
定义注解
使用 @interface
自定义注解时,自动继承了 java.lang.annotation.Annotation
接口
@interface 用来声明一个注解,格式:public @interface 注解名 {定义内
/**
* 定义一个注解
*/
@Target(value={ElementType.METHOD, ElementType.TYPE}) // target表示我们注解应用的范围,在方法上,和类上有效
@Retention(RetentionPolicy.RUNTIME) // Retention:表示我们的注解在什么时候还有效,运行时候有效
@Documented // 表示说我们的注解是否生成在java doc中
@Inherited // 表示子类可以继承父类的注解
@interface MyAnnotation {
// 注解的参数:参数类型 + 参数名()
String name() default "";
int age() default 0;
// 如果默认值为-1,代表不存在
int id() default -1;
String[] schools();
}
@interface 用来声明一个注解,格式:public @interface 注解名 {定义内
/** * 定义一个注解 */
@Target(value={ElementType.METHOD, ElementType.TYPE}) // target表示我们注解应用的范围,在方法上,和类上有效
@Retention(RetentionPolicy.RUNTIME) // Retention:表示我们的注解在什么时候还有效,运行时候有效
@Documented // 表示说我们的注解是否生成在java doc中
@Inherited // 表示子类可以继承父类的注解
@interface MyAnnotation {
// 注解的参数:参数类型 + 参数名()
String name() default "";
int age() default 0;
// 如果默认值为-1,代表不存在
int id() default -1;
String[] schools();
}
反射机制
Java不是动态语言,但是Java可以称为“准动态语言”。即Java有一定的动态性,我们可以利用反射机制来获取类似于动态语言的 特性。
反射机制运行程序在执行期借助于Reflection API 取的任何类内部的信息,并能直接操作任意对象的内部属性及方法。
Class c = Class.forName("java.lang.String")
反射相关的主要API
-
java.lang.Class:代表一个类
-
java.lang.reflect.Method:代表类的方法
-
java.lang.reflect.Field:代表类的成员变量
-
java.lang.reflect.Constructor:代表类的构造器
Class类常用的方法
-
ClassforName(String name):返回指定类name的Class对象
-
newInstance():调用缺省构造函数,返回Class对象的一个实例
-
getName():返回此Class对象所表示的实体(类,接口,数组或void)的名称
-
getSuperClass():返回当前Class对象的父类Class对象
-
getinterfaces():返回当前对象的接口
-
getClassLoader():返回该类的类加载器
-
getConstructors():返回一个包含某些Constructor对象的数组
-
getMethod(String name, Class… T):返回一个Method对象,此对象的形参类型为paramsType
-
getDeclaredFields():返回Field对象的一个数组
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战