【java--反射】注解(反射解析注解+注解应用)

创建实体类

package cn.com.codingce.iocannotation;

/**
 * @Author: Jiangjun
 * @Date: 2019/10/7 9:54
 */
public class Person {

    private String name;
    private Integer age;
    private String sex;

	(get set方法省略)
	
    public Person(String name, Integer age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    @MyAnnotation({"掌上编程","18","男"})
    public Person() {
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}

MySpring类
设计一个方法 给一个类名字 返回一个对象 对象内的属性值存在着
1 通过传递的className来获取对应的类class
2 通过clazz 创建 一个空值对象
obj = clazz.newInstance
找到的是无参构造方法
3 创建对象以后 将对象内的属性自动赋值 依赖注入 DI
值存入--》文件 好处在于代码包装(.jar)起来不能修改 文件还能修改 不好的是 在于开发的时候 源代码和配置文件不在一起 读取/修改 比较麻烦
之前是.xml 文件 单数项目上线 就不怎么修改配置文件 甚至是不修改配置文件 后逐渐以注解开发
值--》注解 编写开发的时候方便 源代码和注解在一起 读取/修改比较容易 不好在于 代码包装后 注解携带的信息不能修改
获取属性的值 --》类无参数构造方法之上
获取a注解对象内携带的信息--》person】对象所有的属性值
将values中每一个值对应的付给属性
找寻属性对应的set方法

package cn.com.codingce.iocannotation;

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

/**
 * @Author: Jiangjun
 * @Date: 2019/10/7 10:15
 */
public class MySpring {

    public Object getBean(String className) {
    
        Object obj = null;
        try {
            Class clazz = Class.forName(className);
            Constructor con = clazz.getConstructor();
            obj = con.newInstance();
            Annotation a = con.getAnnotation(MyAnnotation.class);
            Class aclazz = a.getClass();
            Method amethod = aclazz.getMethod("value");
            String[] values = (String[]) amethod.invoke(a);
            System.out.println("注解内获取的属性值》》》》》》》" + values.length);
            Field[] fields = clazz.getDeclaredFields();
            System.out.println("从类中获取的全部属性包括私有》》》》》" + fields.length);
            for(int i = 0;i<fields.length;i++){
                /**
                 * 获取属性名字
                 * 处理set方法字符串
                 * 第一个字母大写
                 * 拼接字符串  StringBuilder
                 * 通过处理好的set方法名字找到对应的set方法
                 * 执行找到的set方法
                 * 需要将注解读取的值转换成属性类型对应的值 属性类型的构造方法  (Integer  String)
                 */
                String fieldName = fields[i].getName();
                String firstLetter = fieldName.substring(0,1).toUpperCase();
                String otherLetter = fieldName.substring(1);
                StringBuilder setMethodName = new StringBuilder("set");
                setMethodName.append(firstLetter);
                setMethodName.append(otherLetter);
                Class fieldType = fields[i].getType();
                Method setMethod = clazz.getMethod(setMethodName.toString(),fieldType);
                setMethod.invoke(obj,fieldType.getConstructor(String.class).newInstance(values[i]));
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return obj;
    }
}

自定义注解

package cn.com.codingce.iocannotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;

/**
 * @Author: Jiangjun
 * @Date: 2019/10/7 9:57
 */
@Target({ANNOTATION_TYPE, ElementType.METHOD,ElementType.FIELD,ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {

    String[] value();
}

主函数测试

package cn.com.codingce.iocannotation;

/**
 * @Author: Jiangjun
 * @Date: 2019/10/7 10:52
 */
public class TestMain {
    public static void main(String[] args) {
        /**
         * 获取Person对象
         * 之前 Person p = new Person(); p.setName("掌上编程");
         * 改变处理  不用自己处理 跟被人要 MySpring
         * 对象创建权力反转(IOC) 管理 赋值(自动) 别人处理
         * ms 管理者 帮助我们创建对象 自动赋值
         */
        MySpring ms = new MySpring();
        Person p = (Person) ms.getBean("cn.com.codingce.iocannotation.Person");
        System.out.println(p.toString());

    }
}

运行细节
细节错误
最后运行结果
正确运行结果

原文链接
https://blog.csdn.net/weixin_43874301/article/details/102295531

posted @ 2019-10-07 11:44  Coding小马  阅读(411)  评论(0编辑  收藏  举报