注解与反射学习笔记
注解
注解是什么
Annotation的
-
Annotation的作用:
不是程序本身,可以对程序做出解释(这一点和(common)没什么区别)
-
Annotation的格式:
注解是以“@注释名”在代码中存在的,还可以添加一些参数值,例如:@SuppressWarning(value=“unchecked”)
-
Annotation使用位置:
可以附加在package/class/method/field等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问
内置注解
-
@Override:定义在java.lang.Override中,此注释只适用于修饰方法,表示一个方法声明打算重写超类中的另一个方法声明
-
@Deprecated:定义在java.lang.Deprecated中,此注释可以修饰方法,属性,类。 表示此方法已废弃、暂时可用,但以后此类或方法都不会再更新、后期可能会删除,建议后来人不要调用此方法。
-
@SuppressWarnings:定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息,与前注解不同,你需要添加一个参数才可以正确使用,这些参数都是已经定义好的
@SuppressWarnings(“all”)/@SuppressWarnings("unchecked")/@@SuppressWarnings(value={"unchecked","deprecation"}) ......等等
package com.aly.annotation;
import java.util.ArrayList;
import java.util.List;
/**
* @author aly
* @version 1.0
* @date 2020/10/22 9:18
*/
//什么是注解
public class Test01 extends Object {
//重写的注解
元注解
-
元注解的作用就是负责注解其他注解,Java定义了4个标准的meta-annotation类型,他们被用来提供对其他annotation类型作说明
-
这些类型和它们所支持的类在java.lang.annotation包中可以找到.(@Target,@Retention,@Documented,@Inherited)
@Target:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
@Retention:表示需要在什么级别保存该注释信息,用于描述注解的生命周期
SOUERCE<CLASS<RUNTIME
@Document:说明该注解将被包含在javadoc中
@Inherited:说明子类可以继承父类中的注解
package com.aly.annotation;
import java.lang.annotation.*;
/**
* @author aly
* @version 1.0
* @date 2020/10/22 9:24
*/
//测试元注解
public class Test02 {
自定义注解
-
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口
-
分析
@interface用来声明注解,格式:public @interface 注解名{定义内容}
其中的每一个方法实际上声明了一个配置参数
方法的名称就是参数的名称
返回值类型就是参数的类型(返回值只有基本数据类型,Class,String,enum)
可以通过default来声明参数的默认值
如果只有一个参数成员,一般参数名为value
注解元素必须要有值,我们定义注解元素时,经常使用空字符串,0作为返回值
package com.aly.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author aly
* @version 1.0
* @date 2020/10/22 11:15
*/
//自定义注解
public class Test03 {
//注解可以显示赋值 如果没有默认值 我们就必须给注解赋值
反射机制
Java Reflection
-
Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象内部属性及方法
Class c = Class.forName("java.lang.String") -
加载类完成之后,在堆内存的方法区就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射 : 通过反射可以获得类的所有信息 通过反射调用方法的效率比直接调用的效率要至少慢一倍以上
正常方式:引入需要“包类”的名称>通过new实例化>取得实例化对象
反射方式:实例化对象>getClass()方法>得到完整的“包类”名称
package com.aly.reflection;
/**
* @author aly
* @version 1.0
* @date 2020/10/22 14:27
*/
//什么叫做反射
public class Test01 {
public static void main(String[] args) {
try {
//通过反射获取类的Class对象
Class c1 = Class.forName("com.aly.reflection.Test01");
Class c2 = Class.forName("com.aly.reflection.Test01");
Class c3 = Class.forName("com.aly.reflection.Test01");
Class c4 = Class.forName("com.aly.reflection.Test01");
//一个类在内存中只有一个Class对象
//一个类被加载后,类的整个结构都会被封装在Class对象中
System.out.println(c1.hashCode());
System.out.println(c2.hashCode());
System.out.println(c3.hashCode());
System.out.println(c4.hashCode());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
//创建一个实体类:pojo entity
class User {
String userName;
String password;
