注解和反射的简单学习
以前对于这两个概念其实没有多少认识,只知道注解是标记,对于反射的印象就是类比于游戏进度的回显吧,惭愧惭愧~~~学习后有了一些更深入的了解,记录一下,加深印象。
注解(Annotation)
-
什么是注解?
是 JDK5.0 引入的一种注释机制,代码辅助工具,由内置注解和元注解组成。核心作用是对类、方法、变量、参数和包进行标注,通过反射来访问标注信息,以此在运行中改变标注对象的行为。 -
内置注解
@Override(重写方法):被用于标注方法,用于说明所标注的方法是重写父类的方法
@Deprecated(过时方法):用于说明所标注元素,因存在安全问题或有更好选择而不鼓励使用,如果强行使用,则编译器会发出警告
@SuppressWarnings(消除警告):用于取消编辑器所显示的警告,有如下属性值
@SafeVarargs(消除泛型警告) : Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告
@FunctionalInterface (标记函数): Java 8 开始支持,标识一个匿名函数或函数式接口
@Repeatable(多次声明) : Java 8 开始支持,标识某注解可以在同一个声明上使用多次
-
元注解:java提供了四个用于修饰自定义注解的元注解
@Target:用于指定被修饰的自定义注解只能用于修饰程序中哪些元素
ElemenetType.CONSTRUCTOR:构造器声明
ElemenetType.LOCAL_VARIABLE:局部变量声明
ElemenetType.PACKAGE:包声明
ElemenetType.PARAMETER :参数声明
ElemenetType.METHOD :方法声明
ElemenetType.FIELD:全局属性声明(包括 enum 实例)
ElemenetType.TYPE:类,接口(包括注解类型)或enum声明@Retention:用于指定被修饰的自定义注解可以保留多久,有三个常用属性
RetentionPolicy.SOURCE:在源文件中有效(即源文件保留)
RetentionPolicy.CLASS:在class文件中有效(即class保留)
RetentionPolicy.RUNTIME:在运行时有效(即运行时保留)@Documented:执行javadoc命令时,被该元注解修饰的自定义注解也会生成在文档中
@Inherited:如果父类所使用的注解有此修饰,则子类可以继承该注解,否则不能
-
自定义注解实例
1 @Target({ElementType.FIELD,ElementType.TYPE})//可修饰属性和类 2 @Retention(RetentionPolicy.RUNTIME)//运行时 3 public @interface RefStudy { 4 5 String name() default "a"; 6 String[] mores(); 7 }
反射(reflection)
- 反射是什么?
运行过程中,对于任意类,都能知道类的所有属性和方法;对弈任意对象,都能调用它的方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射。 - 反射的优缺点
- 反射提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力
- 它允许程序创建和控制任何类的对象,无需提前硬编码目标类
- 反射会对性能造成一定的影响,同时让代码的可读性变低
- 常用方法
方法名 返回值 参数描述 Class.forName(String) 类的元信息 类文件的具体位置 类.getClass() 类的元信息 clz.getDeclaredFields() 类中的所有属性 getMethods() 类的所有方法 invoke(obj) 通过反射执行方法 类的元信息 getAnnotation(class) 注解 类的Class setAccessible(true) 设置当前属性为可见 true或者false clz.newInstance() 类的实例对象