【java--反射】注解(反射解析注解+注解应用)
生活随笔
收集整理的這篇文章主要介紹了
【java--反射】注解(反射解析注解+注解应用)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
創(chuàng)建實(shí)體類
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() {}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", sex='" + sex + '\'' +'}';} }MySpring類
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 {/*** 設(shè)計(jì)一個(gè)方法 給一個(gè)類名字 返回一個(gè)對(duì)象 對(duì)象內(nèi)的屬性值存在著* 1 通過傳遞的className來獲取對(duì)應(yīng)的類class* 2 通過clazz 創(chuàng)建 一個(gè)空值對(duì)象* obj = clazz.newInstance* 找到的是無參構(gòu)造方法* 3 創(chuàng)建對(duì)象以后 將對(duì)象內(nèi)的屬性自動(dòng)賦值 依賴注入 DI* 值存入--》文件 好處在于代碼包裝(.jar)起來不能修改 文件還能修改 不好的是 在于開發(fā)的時(shí)候 源代碼和配置文件不在一起 讀取/修改 比較麻煩* 之前是.xml 文件 單數(shù)項(xiàng)目上線 就不怎么修改配置文件 甚至是不修改配置文件 后逐漸以注解開發(fā)* 值--》注解 編寫開發(fā)的時(shí)候方便 源代碼和注解在一起 讀取/修改比較容易 不好在于 代碼包裝后 注解攜帶的信息不能修改* 4 獲取屬性的值 --》類無參數(shù)構(gòu)造方法之上* 5 獲取a注解對(duì)象內(nèi)攜帶的信息--》person】對(duì)象所有的屬性值* 6 將values中每一個(gè)值對(duì)應(yīng)的付給屬性* 找尋屬性對(duì)應(yīng)的set方法*/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("注解內(nèi)獲取的屬性值》》》》》》》" + values.length);Field[] fields = clazz.getDeclaredFields();System.out.println("從類中獲取的全部屬性包括私有》》》》》" + fields.length);for(int i = 0;i<fields.length;i++){/*** 獲取屬性名字* 處理set方法字符串* 第一個(gè)字母大寫* 拼接字符串 StringBuilder* 通過處理好的set方法名字找到對(duì)應(yīng)的set方法* 執(zhí)行找到的set方法* 需要將注解讀取的值轉(zhuǎn)換成屬性類型對(duì)應(yīng)的值 屬性類型的構(gòu)造方法 (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(); }主函數(shù)測(cè)試
package cn.com.codingce.iocannotation;/*** @Author: Jiangjun* @Date: 2019/10/7 10:52*/ public class TestMain {public static void main(String[] args) {/*** 獲取Person對(duì)象* 之前 Person p = new Person(); p.setName("掌上編程");* 改變處理 不用自己處理 跟被人要 MySpring* 對(duì)象創(chuàng)建權(quán)力反轉(zhuǎn)(IOC) 管理 賦值(自動(dòng)) 別人處理* ms 管理者 幫助我們創(chuàng)建對(duì)象 自動(dòng)賦值*/MySpring ms = new MySpring();Person p = (Person) ms.getBean("cn.com.codingce.iocannotation.Person");System.out.println(p.toString());} }運(yùn)行細(xì)節(jié)
最后運(yùn)行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的【java--反射】注解(反射解析注解+注解应用)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开发常见单词Java
- 下一篇: 常见锁的概念