黑马程序员技术交流社区
标题:
[石家庄校区] 阶段易错点
[打印本页]
作者:
cyy1737
时间:
2019-5-19 10:37
标题:
[石家庄校区] 阶段易错点
这道代码题的易错点在
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(
"
狗吃肉
"
);
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2