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()); } }