javaBean自动生成通过xml配置文件

新手发帖  希望高手指定

 

我的意思就是想写个框架  可以通过自动生成bean  然后再写orm框架  目的是练手

粗略的实现了bean的生成

Config.xml:

<?xml version="1.0" encoding="utf-8" ?>
<make>
	<class>
		<class-permissions>public</class-permissions>
		<class-name>Hello</class-name>
	</class>
	<field>
		<field-permissions>private</field-permissions>
		<field-type>String</field-type>
		<field-name>name</field-name>
	</field>
	<field>
		<field-permissions>private</field-permissions>
		<field-type>int</field-type>
		<field-name>userid</field-name>
	</field>
	<field>
		<field-permissions>private</field-permissions>
		<field-type>String</field-type>
		<field-name>password</field-name>
	</field>
	
</make>


自动生成类以及编译的类

AutoMakeClass.java

package com.codeguy;
import java.io.File;
import java.io.FileOutputStream;

import java.util.Iterator;

import javax.xml.crypto.Data;

import com.sun.tools.javac.*; 
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.*;



public class AutoMakeClass {

	private static Main javac =  new com.sun.tools.javac.Main(); 
	public static void autoMakeClass()throws Exception{
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read("Config.xml");
		Element element = document.getRootElement();
		Iterator it = element.elementIterator();
		String className = null;
		String classType = null;
		while(it.hasNext()){
			Element el = (Element)it.next();
			if("class".equals(el.getName())){
				Iterator itc = el.elementIterator();
				while(itc.hasNext()){
					Element itSubc = (Element)itc.next();
					if("class-permissions".equals(itSubc.getName())){
						classType = itSubc.getText();
					}
					if("class-name".equals(itSubc.getName())){
						className = itSubc.getText();
					}
				}
				break;
			}
		}
		File file = new File(System.getProperty("user.dir")+"\\src\\"+className+".java");
		FileOutputStream fos = new FileOutputStream(file);
		StringBuffer javaText = new StringBuffer();
		String retType = null;
		javaText.append(classType+" class "+className+" {\r");
		while(it.hasNext()){
			Element el = (Element)it.next();
			if("field".equals(el.getName())){
				Iterator itc = el.elementIterator();
				while(itc.hasNext()){
					Element itSub = (Element)itc.next();
					if("field-permissions".equals(itSub.getName())){
						javaText.append("\t"+itSub.getText()+" ");
					}
					if("field-type".equals(itSub.getName())){
						javaText.append(" "+(retType=itSub.getText())+" ");
					}
					if("field-name".equals(itSub.getName())){
						javaText.append(" "+itSub.getText()+";\r\t");
						String name = itSub.getText();
						
						javaText.append("public void set"+upCase(name)+"("+retType+" "+name+"){\r\t");
						javaText.append("\tthis."+name+"="+name+";\r");
						javaText.append("}\r");
						javaText.append("public "+retType+" get"+upCase(name)+"(){\r\t");
						javaText.append("return this."+name+";\r}\r");
					}
				}
				
			}
		}
		javaText.append("}");
		fos.write(javaText.toString().getBytes());
		fos.close();
		compileEx();
	}
	public static String getFiledType(String name)throws Exception{
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read("Config.xml");
		Element element = document.getRootElement();
		Iterator it = element.elementIterator();
		String type = null;
		while(it.hasNext()){
			Element el = (Element)it.next();
			if("field".equals(el.getName())){
				Iterator itc = el.elementIterator();
				while(itc.hasNext()){
					Element e = (Element)itc.next();
					if("field-type".equals(e.getName())){
						type = e.getText();
					}
					if(name.equals(e.getText())){
						return type;
					}else{
						continue;
					}
				}
			}else{
				continue;
			}
		}
	return null;
	}
	public static Class byStringGetType(String name)throws Exception{
		String type = getFiledType(name);
		Class cls = null;
		if(type.equals("int") || type.equals("Integer")){
			cls = int.class;
		}else if(type.equals("String")){
			cls = String.class;
		}else if(type.equals("Double") || type.equals("double")){
			cls = double.class;
		}else if(type.equals("float") || type.equals("Float")){
			cls = float.class;
		}else if(type.equals("char") || type.equals("Character")){
			cls = char.class;
		}else if(type.equals("Long") || type.equals("long")){
			cls = long.class;
		}else if(type.equals("Byte") || type.equals("byte")){
			cls = byte.class;
		}else if(type.equals("boolean") || type.equals("Boolean")){
			cls = boolean.class;
		}else if(type.equals("Date")){
			cls = Data.class;
		}else if(type.equals("short") || type.equals("Short")){
			cls = short.class;
		}
		return cls;
	}
	public static String upCase(String str){
		char fristCh = str.charAt(0);
		if(Character.isUpperCase(fristCh)){
			return str;
		}
		String buf = str.substring(1);
		StringBuffer retStr = new StringBuffer();
		retStr.append((char)(fristCh-0x20));
		retStr.append(buf);
		return retStr.toString();
	}
	private static void compileEx(){
		String dir = System.getProperty("user.dir");
		String[] command = {"-d",dir+"\\bin\\",dir+"\\src\\Hello.java"};
		javac.compile(command);
	}
}


使用反射来调用get和set方法:

UseBean.java

package com.codeguy;

import java.lang.reflect.*;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class UseBean {
	
	private Class cls = null;
	private Object obj = null;
	public UseBean()throws Exception{
		cls = Class.forName("Hello");
		obj = cls.newInstance();
	}
	public  void setField(String name,Object arg)throws Exception{
		Method method = cls.getMethod("set"+AutoMakeClass.upCase(name), AutoMakeClass.byStringGetType(name));
		method.invoke(obj, arg);
	}
	public  Object getField(String name)throws Exception{
		Method method = cls.getMethod("get"+AutoMakeClass.upCase(name));
		return method.invoke(obj);
	}

}


最后就是测试类了:

package com.codeguy.Test;

import com.codeguy.AutoMakeClass;
import com.codeguy.UseBean;

public class Test {
	public static void main(String[] args)throws Exception {
		AutoMakeClass.autoMakeClass();
		//设置bean属性
		UseBean ub = new UseBean();
		ub.setField("name", "fanhao");
		ub.setField("userid", 1);
		ub.setField("password", "admin");
		//显示属性
		String name = (String)ub.getField("name");
		System.out.println(name);
		int userid = (Integer)ub.getField("userid");
		System.out.println(userid);
		String password = (String)ub.getField("password");
		System.out.println(password);
	}
}


代码很凌乱 没整理  只是考虑测试实现 没有考虑其他的  还有包并没有处理

测试结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值