转载

【java实例】自己动手实现IOC和MVC(五)

下面介绍几个工具类会在项目中用到 ① BeanUtils.Java 对java反射中操作的一些封装
  1. package com.ajunframework.beans.utils;
  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.Field;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.lang.reflect.Method;
  6. import java.lang.reflect.Modifier;
  7. /**
  8.  * @author harries
  9.  * @http://www.liuhaihua.cn
  10.  */
  11. public class BeanUtils {
  12.     /**
  13.      * 实例化一个class 
  14.      * @param <T>
  15.      * @param clazz Person.class
  16.      * @return
  17.      */
  18.     public static <T> T instanceClass(Class<T> clazz){
  19.         if(!clazz.isInterface()){
  20.             try {
  21.                 return clazz.newInstance();
  22.             } catch (InstantiationException e) {
  23.                 e.printStackTrace();
  24.             } catch (IllegalAccessException e) {
  25.                 e.printStackTrace();
  26.             }
  27.         }
  28.         return null;
  29.     }
  30.     /**
  31.      * 通过构造函数实例化
  32.      * @param <T>
  33.      * @param ctor
  34.      * @param args
  35.      * @return
  36.      * @throws IllegalArgumentException
  37.      * @throws InstantiationException
  38.      * @throws IllegalAccessException
  39.      * @throws InvocationTargetException
  40.      */
  41.     public static <T> T instanceClass(Constructor<T> ctor, Object... args) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException{
  42.         makeAccessible(ctor);
  43.         return ctor.newInstance(args);//调用构造方法实例化
  44.     }
  45.     /**
  46.      * 查找某个class的方法
  47.      * @param clazz
  48.      * @param methodName
  49.      * @param paramTypes
  50.      * @return
  51.      * @throws SecurityException
  52.      * @throws NoSuchMethodException
  53.      */
  54.     public static  Method findMethod(Class<?> clazz, String methodName, Class<?>... paramTypes){
  55.         try {
  56.             return clazz.getMethod(methodName, paramTypes);
  57.         } catch (NoSuchMethodException e) {
  58.             return findDeclaredMethod(clazz, methodName, paramTypes);//返回共有的方法
  59.         }
  60.     }
  61.     public static Method findDeclaredMethod(Class<?> clazz, String methodName, Class<?>[] paramTypes){
  62.         try {
  63.             return clazz.getDeclaredMethod(methodName, paramTypes);
  64.         }
  65.         catch (NoSuchMethodException ex) {
  66.             if (clazz.getSuperclass() != null) {
  67.                 return findDeclaredMethod(clazz.getSuperclass(), methodName, paramTypes);
  68.             }
  69.             return null;
  70.         }
  71.     }
  72.     public static Method [] findDeclaredMethods(Class<?> clazz){
  73.             return clazz.getDeclaredMethods();
  74.     }
  75.     public static void makeAccessible(Constructor<?> ctor) {
  76.         if ((!Modifier.isPublic(ctor.getModifiers()) || !Modifier.isPublic(ctor.getDeclaringClass().getModifiers()))
  77.                 && !ctor.isAccessible()) {
  78.             ctor.setAccessible(true);//如果是私有的 设置为true 使其可以访问
  79.         }
  80.     }
  81.     public static Field[] findDeclaredFields(Class<?> clazz){
  82.         return clazz.getDeclaredFields();
  83.     }
  84. }
②BeanWrapper.java 用于设置bean中的属性值
  1. package com.ajunframework.beans.utils;
  2. import java.beans.IntrospectionException;
  3. import java.beans.PropertyDescriptor;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.lang.reflect.Method;
  6. /**
  7.  * @author harries
  8.  * @http://www.liuhaihua.cn
  9.  */
  10. public class BeanWrapper {
  11.     private Object object;
  12.     public BeanWrapper(Object object) {
  13.         super();
  14.         this.object = object;
  15.     }
  16.     public void setPropertyValue(String name,Object value){
  17.             try {
  18.                 PropertyDescriptor pd = new PropertyDescriptor(name,this.object.getClass());
  19.                 Method setMethod = pd.getWriteMethod();
  20.                 setMethod.invoke(object, value);
  21.             } catch (SecurityException e) {
  22.                 e.printStackTrace();
  23.             } catch (IllegalArgumentException e) {
  24.                 e.printStackTrace();
  25.             } catch (IllegalAccessException e) {
  26.                 e.printStackTrace();
  27.             } catch (InvocationTargetException e) {
  28.                 e.printStackTrace();
  29.             }catch (IntrospectionException e) {
  30.                 e.printStackTrace();
  31.             }
  32.     }
  33.     public Object getPropertyValue(String name){
  34.         Object value=null;
  35.         try {
  36.             PropertyDescriptor pd = new PropertyDescriptor(name,this.object.getClass());
  37.             Method getMethod = pd.getReadMethod();
  38.             value = getMethod.invoke(object);
  39.         } catch (IllegalArgumentException e) {
  40.             e.printStackTrace();
  41.         } catch (IntrospectionException e) {
  42.             e.printStackTrace();
  43.         } catch (IllegalAccessException e) {
  44.             e.printStackTrace();
  45.         } catch (InvocationTargetException e) {
  46.             e.printStackTrace();
  47.         }
  48.         return value;
  49.     }
  50. }
③PubConstant.java 读取constant.properties文件
  1. package com.ajunframework.beans.utils;
  2. import java.io.IOException;
  3. import java.util.Properties;
  4. /**
  5.  * @author harries
  6.  * @http://www.liuhaihua.cn
  7.  **/
  8. public class PubConstant {
  9.     private static Properties properties= new Properties();
  10.     static{
  11.         try {
  12.             properties.load(PubConstant.class.getClassLoader().getResourceAsStream("constant.properties"));
  13.         } catch (IOException e) {
  14.             e.printStackTrace();
  15.         }
  16.     }
  17.     public static String getValue(String key){
  18.         String value = (String)properties.get(key);
  19.         return value.trim();
  20.     }
  21. }
下一节我们会做个测试 对现在的ioc
正文到此结束
Loading...