abstractentry.java

来自「mywork是rcp开发的很好的例子」· Java 代码 · 共 131 行

JAVA
131
字号
package net.sf.util.persistence;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.util.StringUtil;

/**
 * IEntry的基于反射的实现,要求子类的属性为public
 * @author levin
 *
 */
public class AbstractEntry implements IEntry {
	private Field[] properties;
	public AbstractEntry() {
		super();
		retrievePropertyFields();
		initContent();
	}
	public String toXML() {
		StringBuffer sb=new StringBuffer();
		sb.append("<").append(this.getClass().getSimpleName().toLowerCase()).append(" ");
		for(int i=0;i<properties.length;i++){
			try {
				sb.append(properties[i].getName()).append("=\"").append(StringUtil.encodeXml((String) properties[i].get(this))).append("\" ");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		sb.append("/>");
		return sb.toString();
	}
	public String[] getContent() {
		String[] ss=new String[properties.length];
		for(int i=0;i<properties.length;i++){
			try {
				ss[i]=(String) properties[i].get(this);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return ss;
	}
	public void setContent(String[] ss) {
        if (ss.length != properties.length)
            return;
        for (int i = 0; i < ss.length; i++) {
			try {
				properties[i].set(this, ss[i]);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	public String getProperty(String propertyName) {
		for(int i=0;i<properties.length;i++){
			if(properties[i].getName().equals(propertyName)){
				try {
					return (String) properties[i].get(this);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		return null;
	}
	public Map getProperties() {
		Map<String,Object> map=new HashMap<String,Object>();
		for(int i=0;i<properties.length;i++){
			try {
				map.put(properties[i].getName(), properties[i].get(this));
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return map;
	}
	public void setProperty(String prop, String value) {
		try {
			this.getClass().getDeclaredField(prop).set(this, value);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public String[] getFieldNames() {
		String[] ss=new String[properties.length];
		for(int i=0;i<properties.length;i++){
			ss[i]=(String) properties[i].getName();
		}
		return ss;
	}
	
	public String[] getFieldDescs() {
		String[] ss=new String[properties.length];
		for(int i=0;i<properties.length;i++){
			ss[i]=(String) properties[i].getAnnotation(EntryTag.class).desc();
		}
		return ss;
	}
	
	@Override
	public String toString() {
		return toXML();
	}
	
	protected void initContent(){
		String[] ss=new String[getContent().length];
		Arrays.fill(ss, "");
		setContent(ss);
	}
	
	//只取public的field
	private void  retrievePropertyFields() {
		Field[] fields = this.getClass().getDeclaredFields();
		List<Field> al=new ArrayList<Field>();
		for(Field f:fields){
			if(Modifier.isPublic(f.getModifiers())){
				al.add(f);
			}
		}
		properties=al.toArray(new Field[0]);
	}

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?