新手发帖 希望高手指定
我的意思就是想写个框架 可以通过自动生成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);
}
}
代码很凌乱 没整理 只是考虑测试实现 没有考虑其他的 还有包并没有处理
测试结果: