一、理论
1、学习资料来源:https://www.runoob.com/w3cnote/java-annotation.html 理论知识可以在这里看,非常详细。
二、自我实践
1、项目目录结构
2.第一阶段学习代码
1.自定义注解:
package com.lixiao.demo.annotation;
import java.lang.annotation.*;
/**
* @Author: lixiao
* @Date: 2020/8/4 10:41
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AnnotationBegin {
String name() ;
}
2.抽象类父类
package com.lixiao.demo.annotation;
/**
* @Author: lixiao
* @Date: 2020/8/4 15:09
* @Description:
*/
public abstract class BaseFatherTest {
public abstract void say();
private int id;
private String name;
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;
}
}
3.抽象类子类
package com.lixiao.demo.annotation;
/**
* @Author: lixiao
* @Date: 2020/8/4 15:19
* @Description:
*/
public class BaseSonTest extends BaseFatherTest {
@Override
public void say() {
System.out.println("say");
}
}
4.注解的使用
package com.lixiao.demo.annotation;
import java.util.Arrays;
/**
* @Author: lixiao
* @Date: 2020/8/4 10:41
*/
public class User {
public User() {
}
@AnnotationBegin(name = "sss")
String[] name;
public String[] getName() {
return name;
}
public void setName(String[] name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + Arrays.toString(name) + '\'' +
'}';
}
}
5.反射实例和反射获取注解
package com.lixiao.demo.annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @Author: lixiao
* @Date: 2020/8/4 10:41
*/
public class AnnotationTest {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InstantiationException {
User user = new User();
/*
* 反射获取Class对象方法一
* */
Class<?> clazz1 = User.class;
/*
* 反射获取Class对象方法二
* */
Class<?> clazz2 = Class.forName("com.lixiao.demo.annotation.User");
/*
* 反射获取Class对象方法三
* */
Class<?> clazz3 = user.getClass();
/*
* 获取对象的hashCode 是否相同
* */
System.out.println(clazz1.hashCode());
System.out.println(clazz2.hashCode());
System.out.println(clazz3.hashCode());
/*
* 反射获取类的属性,方法,构造器等
* 如果是private 修饰的则需要使用getDeclared 方法
* 如果要获取特定的属性,则传入属性对应的名称即可
* 在所有的获取方法都在Class 类中
* */
Class<?> clazz4 = Class.forName("com.lixiao.demo.annotation.BaseFatherTest");
//获取指定属性
System.out.println("指定属性"+clazz4.getDeclaredField("name"));
//获取所有属性
Field[] declaredFields = clazz4.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println("获取所有属性"+declaredField);
}
//获取所有方法
Method[] declaredMethods = clazz4.getDeclaredMethods();
for (Method method : declaredMethods) {
System.out.println("获取所有方法:"+method);
}
//获取指定的方法
System.out.println("获取方法:"+clazz4.getDeclaredMethod("say"));
//获取构造器
System.out.println("获取构造器"+clazz4.getDeclaredConstructor());
//获取注解
Class<?> anno = Class.forName("com.lixiao.demo.annotation.AnnotationBegin");
Annotation[] annotations = anno.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println("获取注解:"+annotation);
}
//获取被注解的属性的值
Class<?> student = Class.forName("com.lixiao.demo.annotation.User");
Field name = student.getDeclaredField("name");
AnnotationBegin annotation = name.getAnnotation(AnnotationBegin.class);
System.out.println("注解的值为:"+annotation.name());
//通过反射来创建对象,并且通过反射获取注解的值,然后赋值
Class<?> u = Class.forName("com.lixiao.demo.annotation.User");
User o = (User)u.newInstance();
o.setName(new String[]{annotation.name()});
System.out.println(o);
}
}
2、个人练习
1.自定义注解
package com.lixiao.demo.annotation.practice;
import java.lang.annotation.*;
/**
* @Author: lixiao
* @Date: 2020/8/4 17:17
* @Description:
*/
@Target({ElementType.TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface StudentAnnotation {
//学号
int stuNumber();
//姓名
String name() default "";
//年龄
int age();
}
2.注解的使用
package com.lixiao.demo.annotation.practice;
/**
* @Author: lixiao
* @Date: 2020/8/4 17:16
* @Description:
*/
@StudentAnnotation(stuNumber = 111,name = "李校",age = 18)
public class Student {
private int stuNumber;
private String name;
private int age;
@Override
public String toString() {
return "Student{" +
"stuNumber=" + stuNumber +
", name='" + name + '\'' +
", age=" + age +
'}';
}
public int getStuNumber() {
return stuNumber;
}
public void setStuNumber(int stuNumber) {
this.stuNumber = stuNumber;
}
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;
}
}
3.使用反射获取注解并且赋值
package com.lixiao.demo.annotation.practice;
import java.lang.reflect.Field;
/**
* @Author: lixiao
* @Date: 2020/8/4 17:25
* @Description:
*/
public class StudentTest {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchFieldException {
//第一步获取Student类的Class模板
Class<?> clazz = Student.class;
//第二步通过Class获取里面的注解
StudentAnnotation stu = clazz.getAnnotation(StudentAnnotation.class);
//第三步通过Class创建对象
Student student = (Student)clazz.newInstance();
//第四步通过注解获取注解设定的值并赋值给创建的studen对象
student.setAge(stu.age());
student.setName(stu.name());
student.setStuNumber(stu.stuNumber());
System.out.println(student);
}
} ``