java反射机制浅析。

来源:互联网 发布:脑图软件 mac 编辑:程序博客网 时间:2024/06/02 04:05

示例代码如下:

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());
}
}







0 0
原创粉丝点击