这道代码题的易错点在AnimalTest这个类里:1)先写这个类把注解写上,写的位置要跟自定义注解规定的一致;2)获取AnimalTest这个类的字节码对象,再通过本类的字节码对象中的getAnnotation方法获取注解对象;3)通过注解对象再去掉自定义注解的方法获取自定义注解的值;4)获取实体类字节码对象;5)根据实体类字节码对象获取构造方法在用获取个构造方法调newInstens方法创建实体类的实例对象;(易错思路比较绕)6)再通过实体类字节码对象获取实体类的成员方法.用成员方法调用invoke去传参调方法;(易错思路比较绕)
package zhujie.lianxi.jiexi;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnimalAnnotation {
String classname()default "zhujie.lianxi.jiexi.Dog";
String methodname()default "eat";
}
package zhujie.lianxi.jiexi;
import org.junit.Assert;
import java.lang.reflect.Method;
@AnimalAnnotation
public class AnimalTest {
public static void main(String[] args) throws Exception {
//获取本类的字节码对象
Class<AnimalTest> ancls = AnimalTest.class;
//根据本类的字节码对象获取注解对象
AnimalAnnotation annclas = ancls.getAnnotation(AnimalAnnotation.class);
//通过注解对象调用注解中的方法获取赋的值或默认值
String classname = annclas.classname();
String methodname = annclas.methodname();
//获取动物类的class对象
Class<?> clas = Class.forName(classname);
//根据获取动物的class对象创建动物的对象实例
Object obj = clas.newInstance();
//根据获取动物的class对象获取动物的方法对象
Method methodclass = clas.getDeclaredMethod(methodname);
//根据方法的对象来执行方法
methodclass.invoke(obj);
}
}
package zhujie.lianxi.jiexi;
public class Cat {
public void eat(){
System.out.println("猫吃鱼");
}
}
package zhujie.lianxi.jiexi;
public class Dog {
public void eat(){
System.out.println("狗吃肉");
}
} |
|