java反射機制淺析。__java

來源:互聯網
上載者:User

範例程式碼如下:

ReflectTest 類:
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;




public class ReflectTest {
  


public static Car  initByDefaultConst() throws Throwable
{
//1.通過類裝載器擷取Car類對象
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("com.jike.spring.chapter03.reflect.Car");

//2.擷取類的預設構造器對象並執行個體化Car
Constructor cons = clazz.getDeclaredConstructor((Class[])null);
Car car = (Car)cons.newInstance();

//3.通過反射方法設定屬性
Method setBrand = clazz.getMethod("setBrand",String.class);
setBrand.invoke(car,"平治");
Method setColor = clazz.getMethod("setColor",String.class);
setColor.invoke(car,"黑色");
Method setMaxSpeed = clazz.getMethod("setMaxSpeed",int.class);
setMaxSpeed.invoke(car,200);
return car;
}

public static Car initByParamConst()  throws Throwable{
//1.通過類裝載器擷取Car類對象
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("com.jike.spring.chapter03.reflect.Car");

//2.擷取類的帶有參數的構造器對象
Constructor cons = clazz.getDeclaredConstructor(new Class[]{String.class,String.class,int.class});

//3.使參數的構造器對象執行個體化Car
Car car = (Car)cons.newInstance(new Object[]{"寶馬","紅色",180});
return car;
}

public static void main(String[] args) throws Throwable {
Car car1 = initByDefaultConst();
Car car2 = initByParamConst();
car1.introduce();
car2.introduce();
}
}




Car 類:
public class Car {
private String brand;


private String color;


private int maxSpeed;


//1.預設建構函式
public Car(){
System.out.println("init car!!");
}

//2.帶參建構函式
public Car(String brand,String color,int maxSpeed){
this.brand = brand;
this.color = color;
this.maxSpeed = maxSpeed;
}

//3.未帶參的方法
public void introduce() {
       System.out.println("brand:"+brand+";color:"+color+";maxSpeed:"+maxSpeed);
}


public String getBrand() {
return brand;
}


public void setBrand(String brand) {
this.brand = brand;
}


public String getColor() {
return color;
}


public void setColor(String color) {
this.color = color;
}


public int getMaxSpeed() {
return maxSpeed;
}


public void setMaxSpeed(int maxSpeed) {
this.maxSpeed = maxSpeed;
}
}


-------------------------------------------------------------------------


import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;


import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;


public class BeanFactory {


private Map<String, Object> beanMap = new HashMap<String, Object>();


/**
* bean工廠的初始化.

* @param xml xml設定檔
*/
public void init(String xml) {
try {
//1.建立讀取設定檔的reader對象
SAXReader reader = new SAXReader();

//2.擷取當前線程中的類裝載器對象
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

//3.從class目錄下擷取指定的xml檔案
InputStream ins = classLoader.getResourceAsStream(xml);
Document doc = reader.read(ins);
Element root = doc.getRootElement();
Element foo;

//4.遍曆xml檔案當中的Bean執行個體
for (Iterator i = root.elementIterator("bean"); i.hasNext();) {
foo = (Element) i.next();

//5.針對每個一個Bean執行個體,擷取bean的屬性id和class
Attribute id = foo.attribute("id");
Attribute cls = foo.attribute("class");

//6.利用Java反射機制,通過class的名稱擷取Class對象
Class bean = Class.forName(cls.getText());
//7.擷取對應class的資訊
java.beans.BeanInfo info = java.beans.Introspector.getBeanInfo(bean);
//8.擷取其屬性描述
java.beans.PropertyDescriptor pd[] = info.getPropertyDescriptors();


//9.建立一個對象,並在接下來的代碼中為對象的屬性賦值
Object obj = bean.newInstance();

//10.遍曆該bean的property屬性
for (Iterator ite = foo.elementIterator("property"); ite.hasNext();) {
Element foo2 = (Element) ite.next();

//11.擷取該property的name屬性
Attribute name = foo2.attribute("name");
String value = null;

//12.擷取該property的子項目value的值
for (Iterator ite1 = foo2.elementIterator("value"); ite1.hasNext();) 
{
Element node = (Element) ite1.next();
value = node.getText();
break;
}

//13.利用Java的反射機制調用對象的某個set方法,並將值設定進去 
for (int k = 0; k < pd.length; k++) {
if (pd[k].getName().equalsIgnoreCase(name.getText())) 
{
Method mSet = null;
mSet = pd[k].getWriteMethod();
mSet.invoke(obj, value);
}
}
}


//14.將對象放入beanMap中,其中key為id值,value為對象
beanMap.put(id.getText(), obj);
}
} catch (Exception e) {
System.out.println(e.toString());
}
}


/**
* 通過bean的id擷取bean的對象.

* @param beanName
*            bean的id
* @return 返回對應對象
*/
public Object getBean(String beanName) {
Object obj = beanMap.get(beanName);
return obj;
}


/**
* 測試方法.

* @param args
*/
public static void main(String[] args) {
BeanFactory factory = new BeanFactory();
factory.init("conf/config.xml");
JavaBean javaBean = (JavaBean) factory.getBean("javaBean");
System.out.println("userName=" + javaBean.getUserName());
System.out.println("password=" + javaBean.getPassword());
}
}







聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.