package testannotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.FIELD,ElementType.CONSTRUCTOR,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)//运行时
public @interface MyAnnotation {
String [] value();
}
package testannotation;
public class Person {
private String name;
private Integer age;
private String sex;
@MyAnnotation({"杨晓航","20","男"})
public Person(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
public class User {
private String username;
private String password;
private Float balance;
@MyAnnotation({"杨晓航","123","10000"})
public User(){}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Float getBalance() {
return balance;
}
public void setBalance(Float balance) {
this.balance = balance;
}
}
package testannotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class MySpring {
public Object getBean(String classname){
Object obj = null;
try {
//1.先通过传递的类名获得对应的Class
Class clazz = Class.forName(classname);
//2.通过Class获取无参数的构造方法
Constructor con = clazz.getConstructor();
//3.构造方法创建一个对象
obj = con.newInstance();
//4.获取属性的值
Annotation a = con.getAnnotation(MyAnnotation.class);
//5.执行value方法
Class clazz2 = a.getClass();
Method method = clazz2.getMethod("value");
String [] values = (String[]) method.invoke(a);
//6.将values的值存入属性中
//找寻属性对应的set方法赋值
//获取传递的Class类全部的私有属性
Field[] filelds = clazz.getDeclaredFields();
for(int i = 0; i < filelds.length; i++){
//获取属性的名字
String fieldName = filelds[i].getName();
String firstName = fieldName.toUpperCase().substring(0,1);
String nextName = fieldName.substring(1);
StringBuilder stringBuilder = new StringBuilder("set");
stringBuilder.append(firstName);
stringBuilder.append(nextName);
//将值通过调用对应的set方法存入属性
//获取数据类型
Class fieldType = filelds[i].getType();
//方法名字,数据类型
Method setMethod = clazz.getMethod(stringBuilder.toString(),fieldType);
//需要将注解内读取到的String类型的值 转化成属性类型对应的值
setMethod.invoke(obj,fieldType.getConstructor(String.class).newInstance(values[i]));
}
} catch (Exception e) {
e.printStackTrace();
}
return obj;
}
}
package testannotation;
public class TestMain {
public static void main(String []args){
MySpring ms = new MySpring();
Person person = (Person) ms.getBean("testannotation.Person");
System.out.println(person.getName()+"--"+person.getSex()+"--"+person.getAge());
User user = (User) ms.getBean("testannotation.User");
System.out.println(user.getBalance()+"--"+user.getPassword()+"--"+user.getUsername());
}
}