A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cyy1737 初级黑马   /  2019-5-19 10:37  /  846 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这道代码题的易错点在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("狗吃肉");
    }
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马