1. 程式人生 > >java 反射,spring 自動注入原理

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; 

不同的包下有檔名相同的javaspring自動注入會報錯

今天閒的蛋疼,做了一下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