注解&反射的学习

一、理论
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); 
    } 
} ``



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值