构建一个注解
    1.@interface 并不是一个完整的接口,我们需要规定注解能写的位置(@targer)
    2.需要写作用域在哪里(源代码,字节码,运行时环境里有)(@Retention)
    3.继承关系可以写可以不写 (@inherited)
    解释,定义了一个String数组,实质的作用是把我们写的参数传递给别人,类似搬运工。
    package myselffannotation;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    @Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyAnnotation {

    1. String[] value();//默认方法 省掉了public static 也有叫属性的这种说法<br />}

    ———————————————————————————————————————————————————————————-
    定义一个person类,存储的信息在注解里
    package myselffannotation;

    public class Person {
    private String name;
    private Integer age;
    private String sex;
    //将信息放入注解里
    @MyAnnotation({“王金成”,”20”,”男”})
    public Person(){}

    1. public String getName() {<br /> return name;<br /> }<br /> public void setName(String name) {<br /> this.name = name;<br /> }<br /> public Integer getAge() {<br /> return age;<br /> }<br /> public void setAge(Integer age) {<br /> this.age = age;<br /> }<br /> public String getSex() {<br /> return sex;<br /> }<br /> public void setSex(String sex) {<br /> this.sex = sex;<br /> }<br />}

    ———————————————————————————————————————————————————————————-
    通过反射的方式去解析注解
    package myselffannotation;

    import java.lang.annotation.Annotation;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;

    public class MySpring {

    1. //设计一个方法 给一个类名字 返回一个对象 对象内的属性值存信息<br /> //因为不确定具体的返回类型,所以采用object类型<br /> public Object getBean(String className){<br /> Object obj = null;//这个变量用来接收最终读取的值<br /> try {<br /> //1.通过传递的className来获取对应的class<br /> //因为forname有可能找不到这个类,所以需要抛出一个异常<br /> Class clazz = Class._forName_(className);//通过名字找到一个类<br /> //2.通过clazz创建一个空的对象<br /> Constructor con = clazz.getConstructor();//找到一个无参数的构造方法<br /> // 需要创建对象<br /> obj = con.newInstance();<br /> //3.创建对象以后,将对象内的所有属性自动赋值<br /> //4.首先获取属性的值,值在类的无参构造方法之上的,<br /> // 想要获取这个值先找到注解对象,先找到无参数构造方法(con),想找构造方法先找到类(clazz)<br /> Annotation a = con.getAnnotation(MyAnnotation.class);<br /> //5.获取a注解对象内携带的信息,信息就是person对象内的需哦有属性的值<br /> Class aclazz = a.getClass();//获取注解类型对应的那个类<br /> Method amethod = aclazz.getMethod("value");//获取注解类型对应类的方法<br /> String[] values = (String[])amethod.invoke(a);//执行,因为是object类型,所以需要类型转换,获取方法中的值<br /> //6.将values中的每一个值对应的赋给属性<br /> //怎么做呢?找寻对应的set方法赋值<br /> Field[] fileds = clazz.getDeclaredFields();//获取注解对应的类的全部的属性<br /> for (int i = 0 ;i < values.length;i++){<br /> //找寻属性的名字<br /> String filedName = fileds[i].getName();<br /> //处理set方法的字符串<br /> String firstLetter = filedName.substring(0,1).toUpperCase();//截取第一个字母,然后大写<br /> String otherLetter = filedName.substring(1);//将属性的名字拆成两段了<br /> StringBuilder setMethodName = new StringBuilder("set");<br /> setMethodName.append(firstLetter);<br /> setMethodName.append(otherLetter);<br /> //通过处理好的set方法名字找到对应的set方法<br /> Class fieldType = fileds[i].getType();<br /> Method setMethod = clazz.getMethod(setMethodName.toString(),fieldType);<br /> //执行找到的set方法 给对应的属性赋值.应该是类去执行这个方法<br /> //需要将注解内读取到的String类型的值,转化成属性类型对应的值,<br /> //因为person里的age属性为integer类型需要转换成String类型的值<br /> //下面的代码代表,先找到属性的类型,<br /> //里面有一个String类型的构造方法,<br /> //用它去创建对象,创建出来的是属性类型的方法,将values给他,通过就创建了一个属性类型的对象<br /> setMethod.invoke(obj,fieldType.getConstructor(String.class).newInstance(values[i]));//类去执行,然后执行的时候需要给一个属性的类型<br /> }
    2. } catch (Exception e) {<br /> e.printStackTrace();<br /> }<br /> return obj;<br /> }

    }
    ———————————————————————————————————————————————————————————-
    package myselffannotation;

    public class TestMain {
    public static void main(String[] args) {
    //通过反射和注解可以不用自己去处理对象了
    //交给别人去处理,我们找他要
    MySpring ms = new MySpring();//帮我们创建对象,帮我们去赋值
    Person p = (Person) ms.getBean(“myselffannotation.Person”);//需要写类的全名
    System.out.println(p.getName()+”—-“+p.getAge()+”—-“+p.getSex());//如果不是这种输出格式需要在person类里重写tostring方法
    }

    }
    总结:
    反射的原理理解不是很好,很多的代码都花了好长时间才弄明白为什么这么写,本节课的内容听的并不是很明白,需要花更多的时间去巩固知识点,多多练习吧