zoukankan      html  css  js  c++  java
  • JavaWeb-spring

    Java反射机制

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

    XML配置

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:util="http://www.springframework.org/schema/util"
        xmlns:p="http://www.springframework.org/schema/p"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/util
        http://www.springframework.org/schema/util/spring-util-4.1.xsd">
        <bean class="com.spring.study04.HelloWordImp" />
    </beans>

    BeanFactory代码

    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());
        }
    }
  • 相关阅读:
    TextView 内容设置成上下滑动 和 代码设置字体颜色
    Android提供了4种在其他线程中访问UI线程的方法
    Android 左右滑屏效果
    【自定义控件】 GridView
    【动画】【特效】activity跳转华丽的过渡效果(转载)
    Android获取设备型号、SDK版本及其系统版本
    【JSON】数据解析
    Android中文API集合
    【AssetManager】的使用与资源预加载
    @property(nonatomic,retain)
  • 原文地址:https://www.cnblogs.com/jyycnblogs/p/5388328.html
Copyright © 2011-2022 走看看