`
tenderuser
  • 浏览: 59321 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

javabean反射

    博客分类:
  • java
阅读更多
明天公司在看,需重构,代码有点乱,可以实现vo的多层反射为map类型。。中间估计有没考虑到的,明天再细看。。。  反射都用不习惯了。。
/**
 * 
 */
package ledkk.test;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;

/**
 * @author ledkk
 *
 */
public class Reflection {
	private static Logger log = Logger.getLogger("Reflection");

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		VOA a = new VOA();
		a.setId(123123L);
		a.setName("voa");
		VOB b = new VOB();
		b.setVobName("voB");
		a.setVob(b);
		List<VOB> vobs = new ArrayList<VOB>();
		vobs.add(b);
		a.setVobs(vobs);
		Map<VOB,String> m = new HashMap<Reflection.VOB, String>();
		m.put(b, "hello");
		a.setMap(m);
		Map<String,Object> map = covertObjToMap(a);
		System.out.println(map.get("name")+"    " + map.get("id") + "   "+map.get("vob"));
		Map<String,Object> vob = (Map<String, Object>) map.get("vob");
		System.out.println(vob.get("vobName"));
		System.out.println(map.get("vobs"));
		System.out.println(map.get("map"));
	}
	
	
	public static Map<String,Object> covertObjToMap(Object obj)throws Exception{
		Map<String,Object> map = new HashMap<String,Object>();
		Class clazz = obj.getClass();
		Method[] methods = clazz.getMethods();
		for(Method method : methods){
			String methodName = method.getName();
			Class retType = method.getReturnType();
			Class[] params = method.getParameterTypes();
			if(methodName.startsWith("set")&&params.length==1){
				Class paramsType = params[0];
				Package p = paramsType.getPackage();
				String getMethodName = methodName.replaceFirst("set", "get");
				if(p!=null){
					String packageName = p.getName();
					Method getMethod = clazz.getMethod(getMethodName, null);
					if(getMethod==null){
						getMethodName = methodName.replaceFirst("set", "is");
						getMethod = clazz.getMethod("", null);
						if(getMethod==null){
							log.info("getMethod is not find !");
							continue;
						}
					}
					
					Object ret = getMethod.invoke(obj, null);
					String fieldName = methodName.replaceFirst("set", "");
					fieldName = Character.toLowerCase(fieldName.charAt(0))+fieldName.substring(1);
					if(p!=null){
						Class retT = ret.getClass();
						if(packageName.startsWith("java.util")){
							Class[] interfaceClasses = retT.getInterfaces();
							if(ret instanceof Collection){
								Collection c = (Collection) ret;
								Collection list = (Collection) retT.newInstance(); 
								for(Object o : c){
									list.add(covertObjToMap(o));
								}
								map.put(fieldName, list);
								continue;
							}
							
							if(ret instanceof Map){
								Map c = (Map) ret;
								Map list = (Map) retT.newInstance();
								Set keySet = c.keySet();
								for(Object o : keySet){
									Object v = c.get(o);
									Package oP = o.getClass().getPackage();
									Package vP = v.getClass().getPackage();
									if(oP!=null&&vP!=null){
										String opName = oP.getName();
										String vPName = vP.getName();
										if((opName.startsWith("java.lang")||opName.startsWith("sun."))&&(vPName.startsWith("java.lang")||vPName.startsWith("sun."))){
											list.put(o, v);
											continue;
										}else if((opName.startsWith("java.lang")||opName.startsWith("sun."))&&!(vPName.startsWith("java.lang")||vPName.startsWith("sun."))){
											list.put(o, covertObjToMap(v));
											continue;
										}else if(!(opName.startsWith("java.lang")||opName.startsWith("sun."))&&(vPName.startsWith("java.lang")||vPName.startsWith("sun."))){
											list.put(covertObjToMap(o), v);
											continue;
										}else if(!(opName.startsWith("java.lang")||opName.startsWith("sun."))&&!(vPName.startsWith("java.lang")||vPName.startsWith("sun."))){
											list.put(covertObjToMap(o), covertObjToMap(v));
											continue;
										}
									}
									list.put(covertObjToMap(o), covertObjToMap(c.get(o)));
								}
								map.put(fieldName, list);
								continue;
							}
							
						}
						if(!(packageName.startsWith("java.lang")||packageName.startsWith("sun."))){
							Object retObj = covertObjToMap(ret);
							map.put(fieldName, retObj);
							continue;
						}
					}else{
						Object retObj = covertObjToMap(ret);
						map.put(fieldName,retObj );
						continue;
					}
					map.put(fieldName, ret);
				}
			}
		}
		return map;
	}
	
	
	public static class VOA{
		private Long id;
		private String name;
		private VOB vob;
		private List<VOB> vobs;
		private Map<VOB,String> map;
		
		
		
		
		/**
		 * @return the map
		 */
		public Map<VOB, String> getMap() {
			return map;
		}
		/**
		 * @param map the map to set
		 */
		public void setMap(Map<VOB, String> map) {
			this.map = map;
		}
		/**
		 * @return the vobs
		 */
		public List<VOB> getVobs() {
			return vobs;
		}
		/**
		 * @param vobs the vobs to set
		 */
		public void setVobs(List<VOB> vobs) {
			this.vobs = vobs;
		}
		/**
		 * @return the id
		 */
		public Long getId() {
			return id;
		}
		/**
		 * @param id the id to set
		 */
		public void setId(Long id) {
			this.id = id;
		}
		/**
		 * @return the name
		 */
		public String getName() {
			return name;
		}
		/**
		 * @param name the name to set
		 */
		public void setName(String name) {
			this.name = name;
		}
		/**
		 * @return the vob
		 */
		public VOB getVob() {
			return vob;
		}
		/**
		 * @param vob the vob to set
		 */
		public void setVob(VOB vob) {
			this.vob = vob;
		}
		
	}
	
	public static class VOB{
		private String vobName;

		/**
		 * @return the vobName
		 */
		public String getVobName() {
			return vobName;
		}

		/**
		 * @param vobName the vobName to set
		 */
		public void setVobName(String vobName) {
			this.vobName = vobName;
		}
		
	}
}



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics