通过注解和反射注入信息

通过注解和反射注入信息

注解@interface

@Snake_Annotation_Method

package 反射.com.zhao.Snake;

import java.lang.annotation.*;
/**
 * 作用在方法上
 * @author hanbaobao
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Snake_Annotation_Method {
    int Swing() default 0;
}

@Snake_Annotation_Type

package 反射.com.zhao.Snake;

import java.lang.annotation.*;

/**
 * 作用在类上
 *
 * @author hanbaobao
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Snake_Annotation_Type {
    String Snake_Name() default "";

    String Snake_Id() default "";

    int Snake_Age() default 0;
}

Snake标准实体类

package 反射.com.zhao.Snake;
/**
 * Snake标准实体类
 */
@Snake_Annotation_Type(Snake_Name = "小青", Snake_Age = 1000, Snake_Id = "00013")
public class Snake {
    private String name;
    private String id;
    private Integer age;
    private String sex;

    @Snake_Annotation_Method(Swing = 1)
    private void swing(Integer num) {
        System.out.println("编号:" + id + "的比赛选手:" + name + "居然" + age + "岁了,却给我们展现出不一样的实力,居然获得了" + num + "名");
    }

    public Snake(String name, String id, Integer age, String sex) {
        this.name = name;
        this.id = id;
        this.age = age;
        this.sex = sex;
    }

    public Snake() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Snake{" +
                "name='" + name + '\'' +
                ", id='" + id + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}

测试类

package 反射.com.zhao.Snake;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author hanbaobao
 * 通过反射和注解注入信息
 */
public class SnakeTest {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        // 1.通过newInstance实例化类的字节码文件
        Class<Snake> snakeClass = Snake.class;
        Snake snake = snakeClass.newInstance();

        // 2.获取Type注解的信息
        Snake_Annotation_Type anno = snakeClass.getAnnotation(Snake_Annotation_Type.class);
        // 3.注入注解的信息(正常set注入)
        snake.setAge(anno.Snake_Age());
        snake.setId(anno.Snake_Id());
        snake.setName(anno.Snake_Name());
        // 3.1 暴力注入sex字段(实体类中没写set语句)
        Field sex = snakeClass.getDeclaredField("sex");
        sex.setAccessible(true);
        sex.set(snake, "1");
        // 3.2 测试注入是否成功
        System.out.println(snake.toString());

        // 4.通过反射获得私有方法
        Method swing = snakeClass.getDeclaredMethod("swing", Integer.class);
        // 5.获得方法上的注解信息
        Snake_Annotation_Method annotation = swing.getAnnotation(Snake_Annotation_Method.class);
        // 6.暴力注入
        swing.setAccessible(true);
        // 7.执行方法
        // 方法.invoke(实例化对象,方法参数)
        swing.invoke(snake, annotation.Swing());
    }
}

结果

Snake{name='小青', id='00013', age=1000, sex='1'}
编号:00013的比赛选手:小青居然1000岁了,却给我们展现出不一样的实力,居然获得了1名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值