引入
假如我有一個類Person,我想通過類來創建物件
import lombok.Data;
@Data //loombok注解
public class Person {
private String name;
private String address;
}
//創建物件
public static void main(String[] args) {
Person person = new Person();
person.setName("張三");
person.setAddre("杭州");
System.out.println(person); //Person(name=張三, addre=杭州)
}
以上沒有任何問題,但是有個弊端,創建的物件是固定死的,代碼也是固定的,如果程式中有很多個物件,那么會出現很多次這樣重復的代碼,對程式可讀性有很大影響,
正文
那么我們該如何減少代碼的重復性呢?
解決:我們可以通過xml組態檔,讀取出xml檔案內容,然后通過反射的方式來動態創建一個自己的類!
- 我們需要先撰寫一個組態檔
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person className="xmlparse.Person">
<property name="name">張三</property>
<property name="addre">杭州</property>
</person>
</persons>
- 測驗程式
- 梳理下邏輯:
- 1.用位元組流方式載入組態檔
- 2.通過xpath決議組態檔中內容
- 3.反射創建物件(依賴決議組態檔結果)
- 4.反射呼叫方法(依賴決議組態檔結果)
- 梳理下邏輯:
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.List;
public class PersonTest {
public static void main(String[] args) throws Exception {
//依靠類加載器用位元組輸入流方式,載入person.xml
InputStream in = _05PersonTest.class.getResourceAsStream("person.xml");
//DOM4J核心類物件SAXReader,決議xml檔案
SAXReader saxReader = new SAXReader();
//read()方法傳遞位元組輸入流,回傳Document物件
Document document = saxReader.read(in);
//獲取根標簽persons
Element rootElement = document.getRootElement();
//xpath語法查詢獲取person標簽
Element person = (Element)rootElement.selectSingleNode("//person");
//xpath語法查詢獲取所有property標簽
List<Element> properties = rootElement.selectNodes("//property");
//獲取第一個property標簽中內容
String name = properties.get(0).getText();
//獲取第二個property標簽中內容
String addre= properties.get(1).getText();
//獲取person標簽中的屬性值
String className = person.attributeValue("className");
//載入對應屬性值"xmlparse.Person"的類
Class<?> personClass = Class.forName(className);
//反射創建物件
Object user = personClass.newInstance();
//反射出方法 setName setAddre
Method setName = personClass.getMethod("setName", String.class);
Method setAddre = personClass.getMethod("setAddre", String.class);
//呼叫方法
setName.invoke(user, name);
setAddre.invoke(user, addre);
//查看結果
System.out.println(user); //Person(name=張三, addre=杭州)
}
}
雖然相比與前面的創建物件方式來看,好像復雜多了,但這樣的好處是代碼中一切物件都會隨著我組態檔改變,而創建不同的物件,增加程式的靈活性,當物件與其依賴項一起提供時,解耦更有效!
我簡單寫了個例子,可能寫的不夠完美,不過可以幫助理解,如有更好的理解,歡迎留言哦~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/259214.html
標籤:java
