自己写的一个小例子,记录一下。
package com.lxq.annotationAndreflection; public class Person { String name="default"; Integer age=0; public Person() { super(); } public Person(String name, Integer age) { super(); this.name = name; this.age = age; } 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; } }
package com.lxq.annotationAndreflection; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) public @interface SelfAnnotation { String name(); }
package com.lxq.annotationAndreflection; public class Injection { @SelfAnnotation(name = "Person") static Person person; public void show() { System.out.println(person.getName()+","+person.getAge()); } }
package com.lxq.annotationAndreflection; import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Test { public static void main(String[] args) throws Exception { //取得Injection的类描述类 Class<Injection> clazz=Injection.class; //取得所有的字段描述对象 Field[] fields=clazz.getDeclaredFields(); System.out.println(fields.length); for(Field field:fields){ //取得每个字段上面的注解对象 Annotation[] annotations=field.getDeclaredAnnotations(); System.out.println(annotations.length); for(Annotation annotation:annotations){ //判断注解对象是不是SelfAnnotation类型的 if(annotation.annotationType()==SelfAnnotation.class){ System.out.println("yes"); //通过SelfAnnotation的name获取要使用的beanName String beanName=((SelfAnnotation) annotation).name(); //生成一个Peron的类描述类 Class<?> cc=Class.forName("com.lxq.annotation."+beanName); //生成一个Person对象 Object ob=cc.newInstance(); System.out.println(field.getName()); //通过此方法将新建的实例对象赋值给 static Peron person //如果是非static,那么set的第一个参数必须指定实例对象,也就是哪个Injection对象 field.set(null, ob); //获取名字为show的方法 Method method=clazz.getDeclaredMethod("show"); //调用该方法 method.invoke(clazz.newInstance()); //基本和上面的一样,只是生成Person对象时,反射调用了带参数的构造 Class<?> c2=Class.forName("com.lxq.annotation."+beanName); Class<?>[] ptype=new Class[]{String.class,Integer.class}; Constructor<?> ctor=c2.getConstructor(ptype); Object[] obj=new Object[]{new String("lxq"),new Integer(25)}; Object object=ctor.newInstance(obj); field.set(null, object); Method method2=clazz.getDeclaredMethod("show"); method2.invoke(clazz.newInstance()); } } } //因为 static Peron person,所以新建的Injectin对象的Peron对象都是通过反射最后赋值过得 Injection injection=new Injection(); System.out.println(injection.person.getName()+","+injection.person.getAge()); } }