创建实体类

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

最新文章

  1. 计算ScrollView的当前页面
  2. webform 创建树
  3. arcgis 栅格计算器(Spatial Analyst/Raster Calculator)
  4. Nginx简单操作
  5. 手机自动化测试:appium源码分析之bootstrap二
  6. Linux系列教程(十八)——Linux文件系统管理之文件系统常用命令
  7. SQL Server 扩展事件(Extented Events)从入门到进阶(3)——通过界面操作Extented Event
  8. TortoiseSVN文件夹图标不显示
  9. Linux服务器限制ssh登录,查看登录日志
  10. js面向对象关键点
  11. leetcode 链表相关
  12. nginx非root安装
  13. angular学习一框架结构认识
  14. linux设备模型:扩展篇
  15. Lakeshore 中文开发界面,示例项目,飞机大战 等 Lakeshore Chinese development interface, sample project, aircraft war, etc
  16. wchar_t和char转化
  17. Emacs_快捷键列表
  18. C#学习笔记(28)——匿名委托和Lambda表达式
  19. Python的自增运算符
  20. 合并区间 &#183; Merge Intervals &amp; 插入区间 &#183; Insert Interval

热门文章

  1. 2020年Acm暑期考核Hznu _2797
  2. 得分(JAVA语言)
  3. APIView里如何获取HTTP里的数据
  4. 如何配置Nginx,实现http访问重定向到https?
  5. java例题_18 乒乓球比赛(对手问题)
  6. vmstat-观察进程上线文切换
  7. 华为联运游戏或应用审核驳回:HMS Core升级提示语言类型错误
  8. Spring 学习笔记(二):SpringIoC
  9. 2. IntelliJ Idea 常用快捷键列表
  10. WERTYU UVA - 10082