通过注解和反射注入信息
注解@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名