创建实体类

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

【java--反射】注解(反射解析注解+注解应用)的更多相关文章

  1. @Aspect 注解切面解析

    注解切面解析 注解切面解析器 /** * 注解切面解析器 */ public class BeanFactoryAspectJAdvisorsBuilder { /** * Bean 工厂 */ pr ...

  2. Spring源码情操陶冶-AnnotationConfigBeanDefinitionParser注解配置解析器

    本文承接前文Spring源码情操陶冶-自定义节点的解析,分析spring中的context:annotation-config节点如何被解析 源码概览 对BeanDefinitionParser接口的 ...

  3. Java注解教程:自定义注解示例,利用反射进行解析

    Java注解能够提供代码的相关信息,同时对于所注解的代码结构又没有直接影响.在这篇教程中,我们将学习Java注解,如何编写自定义注解,注解的使用,以及如何使用反射解析注解. 注解是Java 1.5引入 ...

  4. java ----> 注解/反射

    注解 一个例子,摘自Junit-4.12.jar源码. 1 @Retention(RetentionPolicy.RUNTIME) 2 @Target({java.lang.annotation.El ...

  5. Java基础之反射、注解、代理

    反射 笔者对反射的理解就是解剖class文件,来进行一系列操作. Class类 获取Class类实例的三种方式: 类名.class 对象.getClass() static Class forName ...

  6. Java中的反射和注解

    前言 在Java中,反射机制和注解机制一直是一个很重要的概念,那么他们其中的原理是怎么样呢,我们不仅仅需要会使用,更要知其然而之所以然. 目录 反射机制 反射如何使用 注解定义 注解机制原理 注解如何 ...

  7. Java编程之反射中的注解详解

    "注解"这个词,可谓是在Java编程中出镜率比较高,而且也是一个老生常谈的话题.我们之前在聊Spring相关的东西时,注解是无处不在,之前我们简单的聊过一些"注解&quo ...

  8. Java学习:注解,反射,动态编译

    狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! Java学习:注解,反射,动态编译 Annotation 注解  什么是注解 ? Annotat ...

  9. 【Java基础】反射和注解

    前言 在Java中,反射机制和注解机制一直是一个很重要的概念,那么他们其中的原理是怎么样呢,我们不仅仅需要会使用,更要知其然而之所以然. 目录 反射机制 反射如何使用 注解定义 注解机制原理 注解如何 ...

  10. Java高级特性——反射机制(完结)——反射与注解

    按照我们的学习进度,在前边我们讲过什么是注解以及注解如何定义,如果忘了,可以先回顾一下https://www.cnblogs.com/hgqin/p/13462051.html. 在学习反射和注解前, ...

随机推荐

  1. springboot源码解析-管中窥豹系列之BeanPostProcessor(十二)

    一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...

  2. 记录给树莓派刷Raspberry Pi OS(Raspbian)系统的配置流程

    准备材料 树莓派(一定要贴散热片,最好再加个小风扇) TF内存卡 (记得选传输规范为Class10标准的) 读卡器 电脑(这里我使用的电脑是Windows系统,其它系统可能与下面的步骤有出入,还望悉知 ...

  3. 带你全面认识CMMI V2.0(五)——改进

    改进(Improving)涉及开发.管理和改进过程及其相关资产,其主要重点是提高组织绩效.保持习惯和持久性可确保过程在整个组织中是持久.习惯性地执行和维持,并有助于有效地实现业务绩效目标.治理(GOV ...

  4. [源码解析] 并行分布式任务队列 Celery 之 多进程模型

    [源码解析] 并行分布式任务队列 Celery 之 多进程模型 目录 [源码解析] 并行分布式任务队列 Celery 之 多进程模型 0x00 摘要 0x01 Consumer 组件 Pool boo ...

  5. Java代码格式化规范实践总结

    目标说明 统一良好的代码格式规范可以有效提升开发团队之间的「协作效率」,如果不同的开发团队或者开发人员采用不同的代码格式规范,那么每次Format代码都会导致大量的变化,在Code Review及Me ...

  6. HTML前世今生

    HTML贯穿了整个互联网的发展史,就目前来看,它还会继续下去,因为HTTP和HTTPS协议在互联网中传输的主要内容,也是用户浏览的最终页面管理内容,接下来就来扒一扒HTML的前世今生. 历史舞台已交给 ...

  7. FastDFS一步步搭建存储服务器

    一:FastDFS简介 1:FastDFS简介 FastDFS是一个开源的轻量级分布式文件系统,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适 ...

  8. Java实现操作系统中四种动态内存分配算法:BF+NF+WF+FF

    1 概述 本文是利用Java实现操作系统中的四种动态内存分配方式 ,分别是: BF NF WF FF 分两部分,第一部分是介绍四种分配方式的概念以及例子,第二部分是代码实现以及讲解. 2 四种分配方式 ...

  9. Gson?So easy.

    1.概述 这篇文章主要讲述了Gson的使用.包括从最基础的基本类型的序列化,到对象,数组,集合,再到Gson注解,Gson Builder,再到格式化,自定义序列化与反序列化等内容. 另外文章篇幅较长 ...

  10. Cube painting UVA - 253

     We have a machine for painting cubes. It is supplied with three different colors: blue, red and gre ...