Ⅰ java 中 父類寫初始化代碼 反射獲取類中的所有屬性 並按照某種邏輯賦值(我是為了初始化Spring中的Bean)
這種想法是不可能實現的,父類中是獲取不到子類的屬性的,你需要換一個思路解決問題。
Ⅱ 教你手寫spring框架(一)
spring框架的原理其實主要是dom4j+反射+xml.原理就是將xml用dmo4j解析,然後取出xml中的元素賦值到實體類中,實體類用反射機制獲取其中的屬性。下面具體來說明一下。
首先創建一個UserEntity的實體類.
第一步:創建一個實體類
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="user1" class="entity.UserEntity">
<property name="userId" value="0001"></property>
<property name="userName" value="余勝軍"></property>
</bean>
<bean id="user2" class="entity.UserEntity">
<property name="userId" value="0002"></property>
<property name="userName" value="張三"></property>
</bean>
</beans>
第二步:手寫一個簡單的xml
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student1 id="001">
<>@聽風_與你</>
<學號>20140101</學號>
<地址>上海市浦東新區世紀大道</地址>
<座右銘>要麼強大,要麼聽話</座右銘>
</student1>
<student2 id="002">
<>@聽風_與你</>
<學號>20140102</學號>
<地址>上海市浦東新區世紀大道</地址>
<座右銘>自信不自大,失敗不氣餒,倒了爬起來</座右銘>
</student2>
</students>
第三步:創建一個解析xml並且反射將值賦值的類。
package classForm;
import java.lang.reflect.Field;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import entity.UserEntity;
public class {
private String xmlPath;
public (String xmlPath) {
this.xmlPath = xmlPath;
}
public Object getBean(String beanId) throws Exception {
// 解析xml器
SAXReader saxReader = new SAXReader();
Document read = null;
try {
// 從項目根目錄路徑下 讀取
read = saxReader.read(this.getClass().getClassLoader()
.getResourceAsStream(xmlPath));
} catch (Exception e) {
e.printStackTrace();
}
if (read == null) {
return null;
}
// 獲取根節點資源
Element root = read.getRootElement();
List<Element> elements = root.elements();
if (elements.size() <= 0) {
return null;
}
Object oj = null;
for (Element element : elements) {
String id = element.attributeValue("id");
if (StringUtils.isEmpty(id)) {
return null;
}
if (!id.equals(beanId)) {
continue;
// throw new Exception("使用beanId:" + beanId + ",未找到該bean");
}
// 獲取實體bean class地址
String beanClass = element.attributeValue("class");
// 使用反射實例化bean
Class<?> forNameClass = Class.forName(beanClass);
oj = forNameClass.newInstance();
// 獲取子類對象
List<Element> attributes = element.elements();
if (attributes.size() <= 0) {
return null;
}
for (Element et : attributes) {
// 使用反射技術為方法賦值
String name = et.attributeValue("name");
String value = et.attributeValue("value");
Field field = forNameClass.getDeclaredField(name);
field.setAccessible(true);
field.set(oj, value);
}
}
return oj;
// 1.使用beanId查找配置文件中的bean。
// 2.獲取對應bean中的classpath配置
// 3.使用java反射機制實體化對象Class
}
public static void main(String[] args) throws Exception {
applicationContext = new (
"applicationContext.xml");
UserEntity bean = (UserEntity) applicationContext.getBean("user2");
System.out.println("使用反射獲取bean" + bean.getUserId() + "---" + bean.getUserName());
}
}
當然這是最簡單的手寫spring.這是原理.希望各位有什麼好建議提出來,虛心求教。
Ⅲ spring的原理是什麼
一、 IoC(Inversion of control): 控制反轉x0dx0a1、IoC:x0dx0a概念:控制權由對象本身轉向容器;由容器根據配置文件去創建實例並創建各個實例之間的依賴關系x0dx0a核心:bean工廠;在Spring中,bean工廠創建的各個實例稱作beanx0dx0a二、AOP(Aspect-Oriented Programming): 面向方面編程 。x0dx0a1、 代理的兩種方式:x0dx0a靜態代理:x0dx0a針對每個具體類分別編寫代理類。x0dx0a針對一個介面編寫一個代理類。x0dx0a動態代理:x0dx0a針對一個方面編寫一個InvocationHandler,然後借用JDK反射包中的Proxy類為各種介面動態生成相應的代理類 。x0dx0a2、 AOP的主要原理:動態代理 。x0dx0aSpring工作原理x0dx0aSpring 已經用過一段時間了,感覺Spring是個很不錯的框架。內部最核心的就是IOC了,x0dx0a動態注入,讓一個對象的創建不用new了,可以自動的生產,這其實就是利用java里的反射 ,反射其實就是在運行時動態的去創建、調用對象,Spring就是在運行時,跟xml Spring的配置 文件來動態的創建對象,和調用對象里的方法的 。x0dx0aSpring還有一個核心就是AOP這個就是面向切面編程,可以為某一類對象 進行監督和控制(也就是 在調用這類對象的具體方法的前後去調用你指定的 模塊)從而達到對一個模塊擴充的功能。這些都是通過 配置類達到的。x0dx0aSpring目的:就是讓對象與對象(模塊與模塊)之間的關系沒有通過代碼來關聯,都是通過配置類說明 管理的(Spring根據這些配置 內部通過反射去動態的組裝對象)x0dx0a要記住:Spring是一個容器,凡是在容器里的對象才會有Spring所提供的這些服務和功能。x0dx0aSpring里用的最經典的一個設計模式就是:模板方法模式。
Ⅳ 4.Spring中的反射
Java語言允許通過程序化的方式間接對Class進行操作,Class文件由類裝載器裝載後,在JVM中將形成一份描述Class結構的元信息對象,通過該元信息對象可以獲知Class的結構信息:如構造函數、屬性和方法等。Java允許用戶藉由這個Class相關的元信息對象間接調用Class對象的功能,這就為使用程序化方式操作Class對象開辟了途徑。
———— stamen