| 
 
| 反射 配置文件一般放在src包下
 模拟框架
 public class Person {
 public void eat(){
 System.out.println("人吃菜");
 }
 }
 PZwenjian
 className=com.itheima.Person
 methodName=ea
 public class D1 {
 public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException {
 Properties p = new Properties();
 InputStream is= D1.class.getClassLoader().getResourceAsStream("PZwenjian");
 p.load(is);
 is.close();
 String className = p.getProperty("className");
 String methodName = p.getProperty("methodName");
 Class c = Class.forName(className);
 Constructor con = c.getConstructor();
 Object o = con.newInstance();
 Method m = c.getMethod(methodName);
 m.invoke(o);
 单元测试 三个注解
 @before  功能方法之前执行
 @test   Assert.
 @after  功能方法之后执行
 注解
 @override 检测方法是否继承自父类(接口)
 @Deprecated  提示方法已过时
 @SuppressWarnings  压制警告  一般传递参数"all"
 @function    用于检测接口是否是函数式接口
 自定义注解
 属性 : 接口的抽象方法
 1:返回值类型有下列
 基本数据类型  String   枚举  注解    以上类型的注解
 2:定义了属性,在需要时需要给属性赋值
 1 如果赋值时 ,使用了default关键字给属性赋值,使用时可以不给属性赋值
 2如果属性名叫value描述注解能够作用的位置 且只有一个属性   赋值时value可以省略
 3数组赋值时需要{}
 元注解:用于描述注解的注解
 1@target  :描述注解能够作用的位置
 ElementType 取值
 type 类上
 method 方法上
 file   变量上
 
 2@Retention: 描述注解被保留的阶段
 source
 class
 runtime 一般都是这个值
 @Retention(@Retentionpolicy.runtime )  保留到runtime期间
 3@Dcumented  表示该注解会被抽取到doc文档中
 4@inherited   表示注解会自动被子类继承
 解析注解  获取注解中的属性的值
 1 获取定义注解的class对象
 2 获取注解对象 getAnnotation(注解名.class)
 
 
 | 
 |