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