一、注解
1.概念、作用
注解,可以看作是对 一个 类 的一个扩展的模版,每个 类 按照注解类中的规则,来为 类 注解不同的参数,在用到的地方可以得到不同的 类 中注解的各种参数与值。
2.Java 注解
1.限定父类重写方法:@Overrrid
当子类重写父类方法时,子类可以加上这个注解,那这有什么什么用?这可以确保子类确实重写了父类的方法,避免出现低级错误
2.标示已过时:@Deprecated
这个注解用于表示某个程序元素类,方法等已过时,当其他程序使用已过时的类,方法时编译器会给出警告(删除线,这个见了不少了吧)。
3.抑制编译器警告:@SuppressWarnings
被该注解修饰的元素以及该元素的所有子元素取消显示编译器警告,例如修饰一个类,那他的字段,方法都是显示警告
3.元注解
①修饰注解的注解
②@Target:
使用目标对象;可用枚举属性值为TYPE、FIELD、METHOD、PARAMETER、CONSTRUCTOR 等
③@Retention:
需保留到的最后期限;可用枚举属性值为SOURCE、CLASS、RUNTIME
③@Documentation:是否需要输出到Javadoc
④@Inherited:父类的注解[带有被@Inherited 注解]可以被子类继承
4.自定义注解
①定义:使用@interface
②定义属性:类名+名字()
③赋默认值:default + 默认值
④修饰:使用需要的元注解
Eg1:@Test
public class MyClass{}
这个自定义注解可以修饰程序中的类、方法、变量、接口等。通常放在所有修饰符之前,可以为自己的注解类添加成员变量。
例如:
public @interface MyTag{
//注解中的成员变量以方法的方式来定义
String name();
int age();
}
public class Test{
//当使用自定义注解的时候,这个注解本身是不会生效的,必须由开发者工具提取出来并进行处理。
@MyTag(name = "XX" , age = 6)
public void info(){}
}
还可以为成员变量指定初始值
public @interface MyTag{
String name() default "yeeku"
int age() default 32;
}
当指定完默认值的时候,可以直接@MyTag使用不需要带参数。
二、反射
1.概念、作用
反射是一种计算机处理方式。有程序可以访问、检测和修改它本身状态或行为的这种能力。能提供封装程序集、类型的对象。(程序集包含模块,而模块包含类型,类型又包含成员。)可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问字段和属性。
①反射是能反应对象所属类的完整结构信息[含private ]
②程序运行时,获取类的完整结构信息,如方法、属性、注解等,还能执行方法和修改属性
@MyAnnotation(name = "myTest")
public class Test {
public int id;
private String name;
private int age;
public int sex;
public String createTime;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
}
2.反射类和反射对象
①反射对应的类是Class 类,每个类型对应唯一一个Class 对象,即反射对象
②反射对象创建方式:
Class.forName(“包名.类名”);类名.class;对象.getClass()
public class Test01 {
public static void main(String[] args) throws ClassCastException, ClassNotFoundException {
Class aClass = Class.forName("com.example.annotatioreflection.Test01");
Class<Test01> test01Class = Test01.class;
Test01 test01 = new Test01();
Class aClass1 = test01.getClass();
}
}
3.获取方法、属性
①新建User 类
②获取User 类所有方法和属性
反射对象.getDeclaredMethods()
反射对象.getDeclaredFields()
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test02 {
public static void main(String[] args) throws ClassNotFoundException{
Class aClass = Class.forName("com.example.annotatioreflection.Test02");
Method[] declaredMethods = aClass.getDeclaredMethods();
for (Method declaredMethod : declaredMethods){
System.out.println(declaredMethod);
}
System.out.println("++++++++++++++++++++++++++++");
Field[] declaredClasses = aClass.getDeclaredFields();
for (Field declaredClass : declaredClasses){
System.out.println(declaredClass);
}
}
}
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test03 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchFieldException {
Class aClass = Class.forName( "com.example.annotatioreflection.Test");
Test test = (Test)aClass.newInstance();
Method setName = aClass.getDeclaredMethod("setName",String.class);
setName.invoke(test,"lulu");
System.out.println(test.getName());
System.out.println("===============");
Field age = aClass.getDeclaredField("age");
age.setAccessible(true);
age.set(test,18);
System.out.println(test.getAge());
}
}
4.获取注解对象和属性
①使用前面注解@MyAnnotation 作用到User 类上
②获取注解对象:反射对象.getDeclaredAnnotation(注解的反射对象)
③获取注解属性:注解对象.属性
import java.lang.annotation.Annotation;
public class Test04 {
public static void main(String[] args) throws ClassNotFoundException {
Class aClass = Class.forName( "com.example.annotatioreflection.Test");
Annotation declaredAnnotation = aClass.getDeclaredAnnotation(MyAnnotation.class);
if (declaredAnnotation instanceof MyAnnotation){
MyAnnotation MyAnnotation = (MyAnnotation)declaredAnnotation;
System.out.println(MyAnnotation.name());
}
if (declaredAnnotation instanceof RestController){
System.out.println("is");
}else{
System.out.println("is not");
}
}
}