java 反射,spring 自動注入原理
package com.xiaoqiang.user; public class User { private String username; private String mobile; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } }
package com.xiaoqiang.test; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import com.xiaoqiang.user.User; public class ReflectionTest { @SuppressWarnings({ "unchecked", "rawtypes" }) public static void main(String[] args) throws Exception { // id 為自己指定的值 String id = "user"; Map<String, Object> context = new HashMap<String, Object>(); Class c = Class.forName(User.class.getName()); Object object = c.newInstance(); // 模擬spring容器 context.put(id, object); Method method = c.getDeclaredMethod("setUsername", String.class); // setter注入 method.invoke(object, "xiaoqiang"); System.out.println(((User) object).getUsername()); } }
java 反射定義:JAVA反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為java語言的反射機制。上面的程式碼其實是spring 自動注入的原理。spring自動注入使用的就是java的反射機制。針對java反射定義我們簡單驗證一下:
1對於任意一個類,都能夠知道這個類的所有屬性和方法
package com.xiaoqiang.test; import java.lang.reflect.Field; import java.lang.reflect.Method; import com.xiaoqiang.user.User; public class ReflectionTest { @SuppressWarnings("rawtypes") public static void main(String[] args) throws Exception { Class c = Class.forName(User.class.getName()); System.out.println("------------------------------------"); //獲取所有User類下面定義的所有的方法 Method method[] = c.getDeclaredMethods(); for(int i=0;i<method.length;i++){ System.out.println(method[i].getName()); } System.out.println("------------------------------------"); //獲取所有User類下面定義的所有的屬性 Field f[]=c.getDeclaredFields(); for(int i=0;i<f.length;i++){ System.out.println(f[i].getName()); } System.out.println("------------------------------------"); //獲取所有User類下面定義的所有的方法以及父類的方法 Method method1[] = c.getMethods(); for(int i=0;i<method1.length;i++){ System.out.println(method1[i].getName()); } System.out.println("------------------------------------"); //獲取所有User類下面定義的所有的屬性以及父類的屬性 Field f1[]=c.getDeclaredFields(); for(int i=0;i<f1.length;i++){ System.out.println(f1[i].getName()); } } }
2對於任意一個物件,都能夠呼叫它的任意一個方法和屬性
第一個例子中已經呼叫了方法了。我們一塊來看一下怎麼為私有屬性賦值並呼叫。
package com.xiaoqiang.test;
import java.lang.reflect.Field;
import com.xiaoqiang.user.User;
public class ReflectionTest {
@SuppressWarnings("rawtypes")
public static void main(String[] args) throws Exception {
Class c = Class.forName(User.class.getName());
Object object = c.newInstance();
Field field = c.getDeclaredField("username");
field.setAccessible(true);
field.set(object, "hehe");
System.out.println(((User) object).getUsername());
}
}
此時username的值被設定為hehe
相關推薦
java 反射,spring 自動注入原理
package com.xiaoqiang.user; public class User { private String username; private String mobile; public String getUsername() { retu
java 反射 模擬spring自動注入
基於反射和註解機制,簡單模擬spring解析Autowired註解的過程。 1、自定義Autowired註解,程式碼如下 package com.basic.reflect; import java.lang.annotation.ElementType;
不同的包下有檔名相同的java類,spring自動注入會報錯
今天閒的蛋疼,做了一下spring自動注入的例子: 看看spring自動注入的是否可以區別出不同包下相同名字的java類,答案是不能,spring居然這麼渣。 整體結構圖如下: 1:首先建立兩個同名的java類和介面 com.a包下面有一個IAutoInject介面和實現
java反射導致spring自動注入失敗
這個地方困擾了我很久,一直沒有找到答案,網上的一些回答都只是小片段很是讓人為難,這裡記錄一下自己的解決方式,免得以後忘記。首先我的spring 的bean是我通過掃描包的方式來自動注入的(com.spring.service是我的包名)<context:componen
通過自定義註解和java反射實現Spring-DI依賴注入
依賴注入的原理就是簡單說就是從頭往下遞迴生成依賴物件的,然後對引用欄位賦值最後返回。 這裡實現通過變數型別來生成相應的物件。 模擬一個使用者的註冊業務,首先是controller層呼叫service層,然後呼叫dao層程式碼實現儲存使用者。 檔案結構: UserC
Spring自動注入,利用註解實現spring基本配置詳解,Spring註解快速入門
Spring註解 1.準備工作 (1)匯入common-annotations.jar (2)匯入schema檔案 檔名為spring-context-3.0.3.RELEASE.jar (3)在xml的beans節點中配置 2.xml配置工作 <?xml
基於Java反射的map自動裝配JavaBean工具類設計
person urn exception map.entry ati test javabean 好的 declare 我們平時在用Myabtis時不是常常需要用map來傳遞參數,大體是如下的步驟: public List<Role> findRoles(M
使用java反射,自定義springMvc簡單案例
目前javaWeb開發領域,SpringMvc已經是絕大部分中小公司必選框架,那麼springMvc是如何實現的呢。這裡通過一個簡單的小案例來演示一下。 首先看一下案例的結構圖 目前springBoot專案比較流行,這裡新建一個springBoot專案,先引入專案依賴
@Java 開發者,Spring Boot 最流行的 16 條實踐解讀!
Spring Boot是最流行的用於開發微服務的Java框架。在本文中,我將與你分享自2016年以來我在專業開發中使用Spring Boot所採用的最佳實踐。這些內容是基於我的個人經驗和一些熟知的Spring Boot專家的文章。 在本文中,我將重點介紹Spr
簡單java反射,小例子,僅供參考
package test; public class c { public String cc(String name,String addr){ return "My name is "+nam
spring3.1整合quartz時,spring依賴注入無法注入到quartz的job中的處理方法
定時任務類 package cn.customercard.controller; import java.util.Date; import javax.servlet.ServletContextEvent; import javax.serv
java反射,獲取類物件所有成員變數,從字串呼叫函式
//import java.lang.reflect.Field; /** 獲取Object物件,所有成員變數屬性值 */ public static void getObjAttr(Object obj) { // 獲取物件obj的所有屬性域 Field[] fiel
Java反射+註解實現自動持久化小例子(程式碼未優化)
需要實現的功能:根據實體類自動生成Sql語句與引數。 基本思路是:在實體類上標識註解,使用反射讀取註解然後拼接Sql語句。 哦了,開始研究程式碼~ 有請主人公註解:
Java反射—模擬Spring的Aop
1. 大概流程 上篇文章已經結合Java反射解釋了SpringAop的原理,這裡我們簡單模擬以下Spring的Aop實現。大體流程如下: Ø 建立一個properties配置檔案模擬S
spring 自動注入和 dubbo服務呼叫問題
今天 遇到這樣一個問題: 工程A中我寫寫了一個spring security的自定義認證類,這個類始終不能由容器管理,但是這個時候 我需要通過spring 自動注入某個服務類來獲取使用者相關資訊 來進行認證) 問題出現在: 自定義認證類不是由容器管
java反射在spring中的應用
1.為什麼要用反射? 根據物件可以得到該類的所有資訊,可以做直接操作物件不能做的事,它不是在編譯時執行,而是在執行時執行,也就是執行.class時執行,所以它可以做在編譯時不能做的事,像hibernate的屬性對映就是通過反射來賦值的,spring的bean的
JSP (1): 安裝,簡單demo,如何檢視java原始碼,jsp的工作原理以及轉碼編碼方式
安裝首先下好tomcat和eclipse,eclipse建議使用比較新的版本,舊版本編寫jsp需要安裝外掛十分麻煩。可能出現的問題:tomcat閃退(建議按照裡面的步驟看看自己的tomcat能否成功在電腦上執行再配置)基礎知識預設會一點 java 和 html。新手一般都在&
spring自動注入之註解解析
spring的IOC主要做兩件事:建立bean和注入bean;相比較xml配置的方式使用標註自動注入比較簡單, 首先,建立bean的標註; @Component(不推薦使用)、 泛指元件,也就是所有需
Spring註解注入原理
Spring容器框架包org.springframework.stereotype下Controller註解介面原始碼如下:@Target({java.lang.annotation.ElementType.TYPE})@Retention(RetentionPolicy.RU
spring 自動注入Hibernate中的SessionFactory 探索
之前用Spring的註解模式配置Hibernate的時候覺得很簡單。 使用@autowire 自動注入 @Autowired private SessionFactory sessionFactory; 然後在方法中直接使用 Session session = sessionFact