1、注解(Annotation)
1.1 Annotation的基本概念
- Annotation的作用:(1)可以对程序作出解释;(2)可以被其他程序读取。
- Annotation的格式:
@注解名
- Annotation在哪里使用:可以附加在package、class、method、field等上面,相当于给他们添加了额外的辅助信息,我们可以通过
反射机制
编程实现对这些元数据的访问。
1.2 常见的内置注解
@Override
:重写方法@Deprecated
:过时的方法、属性、类@SuppressWarnings
:抑制警告信息
1.3 自定义注解
- 注解声明:
@interface
,自动继承了java.lang.annotation.Annotation接口。
public @interface 注解名{
}
- @Target:用于描述注解的使用范围。
取值 | 所修饰的范围 |
---|---|
PACKAGE | 包 |
TYPE | 类、接口、枚举、注解 |
FIELD | 属性 |
CONSTRUCTOR | 构造器 |
METHOD | 方法 |
LOCAL_VARIABLE | 局部变量 |
PARAMETER | 参数 |
- @Retention:用于描述注解的生命周期。
取值 | 作用 |
---|---|
PACKAGE | 在源文件有效 |
TYPE | 在class文件有效 |
FIELD | 在运行时有效,为Runtime可以被反射机制读取 |
@Target(value= {ElementType.PACKAGE,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
//参数类型 参数值
String value();
}
2、反射(reflection)机制
2.1 反射的基本概念
- 反射是java动态性之一,指可以在
程序运行中
,可以动态加载一个只有名称的类,产生一个Class对象,通过这个对象就可以调用类的属性和方法。 - 对象是表示或封装一些数据。一个类被加载后,JVM会创建一个对应类的Class对象,类的整个信息结构会放到对应的Class对象中。
2.2 Class类的对象如何获取?
-
Class.forName()
-
getClass()
-
.class
public class TestReflection {
public static void main(String[] args) {
String path = "com.bmg.annotation.User";
try {
//第一种方式
Class clazz = Class.forName(path);
System.out.println(clazz.hashCode());
//第二种方式
Class getClass = path.getClass();
System.out.println(getClass.hashCode());
//第三种方式
Class class1 = String.class;
System.out.println(class1.hashCode());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
2.3 应用反射获取类的名字、属性、方法、构造器等
public class TestReflection {
public static void main(String[] args) {
String path = "com.bmg.annotation.User";
try {
Class clazz = Class.forName(path);
//获取类的名字
System.out.println(clazz.getName()); //com.bmg.annotation.User
System.out.println(clazz.getSimpleName()); //User
//获取类的属性信息
Field[] fields = clazz.getFields(); //只能获取public修饰的属性
Field[] fields1 = clazz.getDeclaredFields(); //获取所有的属性
Field field = clazz.getDeclaredField("age");
for (Field fie : fields1) {
System.out.println("属性:" + fie);
}
//获取方法信息
Method[] methods = clazz.getDeclaredMethods();
Method method = clazz.getDeclaredMethod("getAge", null);
Method method1 = clazz.getDeclaredMethod("setAge", int.class);
for (Method met : methods) {
System.out.println("方法:" + met);
}
//获取构造器
Constructor[] constructors = clazz.getDeclaredConstructors();
for (Constructor cons : constructors) {
System.out.println("构造方法:" + cons);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.4 反射机制读取注解
ORM
(Object Relationship Mapping):对象关系映射
- 类和表结构对应
- 属性和字段对应
- 对象和记录对应
使用注解完成类和表结构的对应关系:
类:User
public class User {
private int id;
private String name;
private int age;
}
表:tb_user
id | uname | age |
---|---|---|
1001 | 张三 | 25 |
1001 | 李四 | 18 |
注解
:
@Target(value= {ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String value();
}
@Target(value= {ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Field {
String columName();
String type();
int length();
}
使用注解
:
@Table("tb_user")
public class User {
@Field(columName="id",type="int",length=10)
private int id;
@Field(columName="uname",type="varchar",length=20)
private String name;
@Field(columName="age",type="int",length=3)
private int age;
}