`
yuancihang
  • 浏览: 145161 次
  • 性别: Icon_minigender_1
  • 来自: 洛阳
社区版块
存档分类
最新评论

JDBC根据数据库生成POJO

阅读更多

1.环境

JDK6

 

2.代码



import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.yuan.common.file.FileUtil;
import com.yuan.common.util.ReflectUtil;

public class POJOGenerator {

   
   
    public static List<String> getTableNameList(Connection conn)throws SQLException{
        List<String> list = new ArrayList<String>();
        DatabaseMetaData dmd = conn.getMetaData();
        ResultSet tables = dmd.getTables(null, dmd.getUserName(), null, new String[]{"TABLE"});
        while(tables.next()){
            list.add(tables.getString("TABLE_NAME"));
        }
       
        return list;
    }
    public static void generatPOJO(Connection conn, String tableName, String packageName, String outputDir)throws SQLException, ClassNotFoundException, IOException{
        DatabaseMetaData dmd = conn.getMetaData();
        ResultSet columns = dmd.getColumns(null, dmd.getUserName(), tableName, null);
        StringBuilder classBuilder = new StringBuilder();
        classBuilder.append("package ").append(packageName).append(";").append("\n\n");
        classBuilder.append("public class ").append(buildClassName(tableName)).append("{").append("\n\n");
        Map<String, String> fieldMap = new LinkedHashMap<String, String>();
        while(columns.next()){
//            System.out.println(columns.getString("COLUMN_NAME") + ", " + columns.getInt("DATA_TYPE") + ", " + columns.getString("TYPE_NAME"));
            fieldMap.put(columns.getString("COLUMN_NAME"), getClassNameForJavaType(columns.getInt("DATA_TYPE")));
        }
        Set<String> fieldNameSet = fieldMap.keySet();
        for(String fieldName : fieldNameSet){
            classBuilder.append("\tprivate ").append(fieldMap.get(fieldName)).append(" ").append(buildPropertyName(fieldName)).append(";\n");
        }
        classBuilder.append("\n");
        for(String fieldName : fieldNameSet){
            String propertyName = buildPropertyName(fieldName);
            Class<?> fieldType = String.class;
            if(fieldMap.get(fieldName).equals("Boolean")){
                fieldType = Boolean.class;
            }
            classBuilder.append("\tpublic ").append(fieldMap.get(fieldName)).append(" ").append(ReflectUtil.generatReadMethodName(propertyName, fieldType));
            classBuilder.append("(){\n");
            classBuilder.append("\t\t return this.").append(propertyName).append(";\n\t}\n");
            classBuilder.append("\n");
            classBuilder.append("\tpublic void ").append(ReflectUtil.generatWriteMethodName(propertyName)).append("(").append(fieldMap.get(fieldName)).append(" ").append(propertyName).append("){\n");
            classBuilder.append("\t\tthis.").append(propertyName).append(" = ").append(propertyName).append(";\n\t}\n");
            classBuilder.append("\n");
        }
        classBuilder.append("}");
       
        FileUtil.writeToFile(classBuilder.toString(), new File(new File(outputDir), buildClassName(tableName) + ".java").getAbsolutePath());
    }
    private static String buildClassName(String tableName){
        String[] tableNameSections = tableName.split("_");
        StringBuilder tb = new StringBuilder();
        for(String tableNameSection : tableNameSections){
            String tmp = tableNameSection.toLowerCase();
            tb.append(Character.toUpperCase(tmp.charAt(0))).append(tmp.substring(1));
        }
        return tb.toString();
    }
    private static String buildPropertyName(String fieldName){
        String[] fieldNameSections = fieldName.split("_");
        StringBuilder tb = new StringBuilder();
        for(int i=0; i<fieldNameSections.length; i++){
            String tableNameSection = fieldNameSections[i];
            String tmp = tableNameSection.toLowerCase();
            if(i == 0){
                tb.append(tmp);
            }else{
                tb.append(Character.toUpperCase(tmp.charAt(0))).append(tmp.substring(1));
            }
        }
       
        if(tb.toString().equals("class")){
            return "className";
        }
        return tb.toString();
    }
    public static void printInfo(ResultSet rs)throws SQLException{
        ResultSetMetaData rsmd = rs.getMetaData();
        int numberOfColumns = rsmd.getColumnCount();
        for(int i=1; i<=numberOfColumns; i++){
            System.out.println("rsmd.getColumnName(i) = " + rsmd.getColumnName(i));
        }
//        while(rs.next()){
//            System.out.println(rs.getString("TABLE_NAME"));
//        }
//        System.out.println("numberOfColumns = " + numberOfColumns);
//        System.out.println("rsmd.getColumnName(1) = " + rsmd.getColumnName(1));
//        System.out.println("rsmd.getColumnLabel(1) = " + rsmd.getColumnLabel(1));
//        System.out.println("rsmd.getColumnType(1) = " + rsmd.getColumnType(1));
        System.out.println("rsmd.getColumnClassName(1) = " + rsmd.getColumnClassName(1));
    }
   
    static String getClassNameForJavaType(int javaType)
    /*     */   {
    /* 730 */     switch (javaType)
    /*     */     {
    /*     */     case -7:
    /*     */     case 16:
    /* 733 */       return "Boolean";
    /*     */     case -6:
    /* 741 */       return "Integer";
    /*     */     case 5:
    /* 749 */       return "Integer";
    /*     */     case 4:
    /* 758 */       return "Long";
    /*     */     case -5:
    /* 763 */         return "Long";
    /*     */
    /*     */     case 2:
    /*     */     case 3:
    /* 770 */       return "java.math.BigDecimal";
    /*     */     case 7:
    /* 773 */       return "Float";
    /*     */     case 6:
    /*     */     case 8:
    /* 777 */       return "Double";
    /*     */     case -1:
    /*     */     case 1:
    /*     */     case 12:
    /* 783 */         return "String";
    /*     */     case -4:
    /*     */     case -3:
    /*     */     case -2:
    /* 795 */        return "byte[]";
    /*     */     case 91:
    /* 801 */       return "java.sql.Date";
    /*     */     case 92:
    /* 804 */       return "java.sql.Time";
    /*     */     case 93:
    /* 807 */       return "java.sql.Timestamp";
    /*     */     }
    /*     */
    /* 810 */     return "Object";
    /*     */   }

}

3. 测试

 

public static void main(String[] args) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection("jdbc:mysql://192.168.5.29/test?user=root&password=123456");
            List<String> tableNameList = POJOGenerator.getTableNameList(conn);
            for(String tableName : tableNameList){
                POJOGenerator.generatPOJO(conn, tableName, "test", "d:/test/test");
            }
            conn.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

分享到:
评论
4 楼 yuetao31512 2012-12-06  
yuancihang 写道
package com.yuan.common.util;

import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* 反射工具类
* Class clazz = Class.forName("com.hxrainbow.util.ReflectUtil");
* Method[] methods1 = clazz.getMethods(); //获得所有的公有方法,包括从父类或者超类继承的方法
* Method[] methods2 = clazz.getDeclaredMethods(); //获得所有声明的方法(包括私有和受保护的方法), 不包括从父类或者超类继承的方法
* methods.toGenericString(); //返回描述此 Method 的字符串,包括类型参数.
* 字段和构造器的方法同上.
* @author 原此航
*
*/
public class ReflectUtil {

private static final Logger logger = LoggerFactory.getLogger(ReflectUtil.class);

/**
* 通过反射来执行公有方法
*
* 用法如下:
* Object obj = new Student();
* execMethod(obj, "setId", 20);
* execMethod(obj, "setName", "wang");
* int id = (Integer)execMethod(obj, "getId");
* String name = (String)execMethod(obj, "getName");
*
* @param obj Object
* @param methodName String
* @param params Object[]
* @return Object
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
public static Object execMethod(Object obj, String methodName, Object... params) throws NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
Object result = null;
Class<?> c = obj.getClass();
Class<?>[] parameterTypes = new Class<?>[]{};

if(params != null){
parameterTypes = new Class<?>[params.length];
for(int i=0;i<params.length;i++){
parameterTypes[i] = params[i].getClass();
}//for
}//if

Method m = getMethod(c, methodName, parameterTypes);
result =  m.invoke(obj, params);
return result;
}
public static Object execStaticMethod(Class<?> c, String methodName, Object... params) throws NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
Object result = null;
Class<?>[] parameterTypes = new Class<?>[]{};

if(params != null){
parameterTypes = new Class<?>[params.length];
for(int i=0;i<params.length;i++){
parameterTypes[i] = params[i].getClass();
}//for
}//if

Method m = getMethod(c, methodName, parameterTypes);
result =  m.invoke(null, params);
return result;
}

/**
* 通过类名来产生一个该类的实例.
* 用法 : String s = (String)newInstance("java.lang.String", "中国");
* @param className String 类全限定名
* @param initargs Object[] 构造函数需要的参数
* @return
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalArgumentException
*/
public static Object newInstance(String className, Object... initargs) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException{
Object instance = null;

Class<?> clazz = Class.forName(className);
Class<?>[] parameterTypes = null;

if(initargs != null){
parameterTypes = new Class<?>[initargs.length];
for(int i=0;i<initargs.length;i++){
parameterTypes[i] = initargs[i].getClass();
}//for
}//if
if((parameterTypes == null) || (parameterTypes.length == 0)){
instance = clazz.newInstance();
}else{
Constructor<?> constructor = getConstructor(clazz, parameterTypes);
instance = constructor.newInstance(initargs);
}
return instance;
}

public static <T extends Object> T newInstance(Class<T> clazz, Object... initargs) throws InstantiationException, IllegalAccessException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException{
T instance = null;

Class<?>[] parameterTypes = null;

if(initargs != null){
parameterTypes = new Class<?>[initargs.length];
for(int i=0;i<initargs.length;i++){
parameterTypes[i] = initargs[i].getClass();
}//for
}//if
if((parameterTypes == null) || (parameterTypes.length == 0)){
instance = clazz.newInstance();
}else{
Constructor<T> constructor = getConstructor(clazz, parameterTypes);
instance = constructor.newInstance(initargs);
}
return instance;
}

/**
* 根据形参查找合适的构造器
* @param <T>
* @param clazz Class<T>
* @param parameterTypes Class<?>[] 实参数组
* @return  Constructor<T>
*/
public static <T extends Object> Constructor<T> getConstructor(Class<T> clazz, Class<?>[] parameterTypes)throws NoSuchMethodException{

Constructor<T>[] allConstructors = (Constructor<T>[])clazz.getConstructors(); //找到所有构造函数

int parameterLen = parameterTypes.length; //实参个数
List<Constructor<T>> similarConstructorList = new ArrayList<Constructor<T>>(); //所有能够执行parameterTypes实参的构造函数
for(Constructor<T> constructor : allConstructors){
if(constructor.getParameterTypes().length == parameterLen){
boolean isSimilarType = true;
Class<?>[] formaParameterTypes = constructor.getParameterTypes(); //得到形参
for(int i=0; i<parameterLen; i++){
if(!isSameOrSupperType(formaParameterTypes[i], parameterTypes[i])){
isSimilarType = false;
break;
}
}
if(isSimilarType){
similarConstructorList.add(constructor);
}
}//if
}

if(similarConstructorList.isEmpty()){
throw new NoSuchMethodException("没有这样的构造函数.");
}

List<Integer> parameterMatchingCountList = new ArrayList<Integer>(); // 存放各个能够执行parameterTypes形参的构造函数对形参的严格匹配个数
for(Constructor<T> constructor : similarConstructorList){
int parameterMatchingCount = 0;
Class<?>[] formaParameterTypes = constructor.getParameterTypes();
for(int i=0; i<parameterLen; i++){
if(formaParameterTypes[i].getName().equals(parameterTypes[i].getName())){
parameterMatchingCount++;
}
}
parameterMatchingCountList.add(parameterMatchingCount);
}
int maxMatchingCountIndex = 0;
for(int i=1; i<parameterMatchingCountList.size(); i++){
if(parameterMatchingCountList.get(maxMatchingCountIndex).intValue() < parameterMatchingCountList.get(i).intValue()){
maxMatchingCountIndex = i;
}
}
return similarConstructorList.get(maxMatchingCountIndex); //
}

public static <T extends Object> List<Method> getMethods(Class<T> clazz, String methodName){
List<Method> methodList = new ArrayList<Method>();
Method[] allMethods = clazz.getMethods(); //找到所有方法
for(Method method : allMethods){
if(method.getName().equals(methodName)){
methodList.add(method);
}
}
return methodList;
}

/**
* 根据形参查找合适的方法
* @param <T>
* @param clazz Class<T>
* @param parameterTypes Class<?>[] 实参数组
* @return  Constructor<T>
*/
public static <T extends Object> Method getMethod(Class<T> clazz, String methodName, Class<?>[] parameterTypes)throws NoSuchMethodException{

Method[] allMethods = clazz.getMethods(); //找到所有方法

int parameterLen = parameterTypes.length; //实参个数
List<Method> similarMethodList = new ArrayList<Method>(); //所有能够执行parameterTypes实参的方法
for(Method method : allMethods){
if(!method.getName().equals(methodName)){
continue;
}
if(method.getParameterTypes().length == parameterLen){
boolean isSimilarType = true;
Class<?>[] formaParameterTypes = method.getParameterTypes(); //得到形参
for(int i=0; i<parameterLen; i++){
if(!isSameOrSupperType(formaParameterTypes[i], parameterTypes[i])){
isSimilarType = false;
break;
}
}
if(isSimilarType){
similarMethodList.add(method);
}
}//if
}

if(similarMethodList.isEmpty()){
StringBuilder sb = new StringBuilder();
sb.append(methodName);
sb.append("(");
if(AssertUtil.notEmpty(parameterTypes)){
StringBuilder parameterTypeBuilder = new StringBuilder();
for(Class<?> parameterType : parameterTypes){
parameterTypeBuilder.append(parameterType.getName()).append(",");
}
if(parameterTypeBuilder.charAt(parameterTypeBuilder.length() - 1) == ','){
parameterTypeBuilder = parameterTypeBuilder.deleteCharAt(parameterTypeBuilder.length() - 1);
}
sb.append(parameterTypeBuilder);
}
sb.append(")");
throw new NoSuchMethodException("没有这样的方法. " + sb.toString());
}

List<Integer> parameterMatchingCountList = new ArrayList<Integer>(); // 存放各个能够执行parameterTypes形参的方法对形参的严格匹配个数
for(Method method : similarMethodList){
int parameterMatchingCount = 0;
Class<?>[] formaParameterTypes = method.getParameterTypes();
for(int i=0; i<parameterLen; i++){
if(formaParameterTypes[i].getName().equals(parameterTypes[i].getName())){
parameterMatchingCount++;
}
}
parameterMatchingCountList.add(parameterMatchingCount);
}
int maxMatchingCountIndex = 0;
for(int i=1; i<parameterMatchingCountList.size(); i++){
if(parameterMatchingCountList.get(maxMatchingCountIndex).intValue() < parameterMatchingCountList.get(i).intValue()){
maxMatchingCountIndex = i;
}
}
return similarMethodList.get(maxMatchingCountIndex); //
}

/**
* 同过反射获得公有字段值
* @param obj Object
* @param fieldName String 字段名
* @return Object
* @throws NoSuchFieldException
* @throws SecurityException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
public static Object getFieldValue(Object obj, String fieldName) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
Object fieldValue = null;
Class<?> clazz = obj.getClass();
Field field = clazz.getField(fieldName);
fieldValue = field.get(obj);
return fieldValue;
}
public static Object getFieldValueWithMethod(Object obj, String fieldName) throws IntrospectionException, IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException{
PropertyDescriptor pd = new PropertyDescriptor(fieldName, obj.getClass());
String readMethodName = pd.getReadMethod().getName();
return execMethod(obj, readMethodName);
}

/**
* 通过反射设置公有字段值
* @param obj Object
* @param fieldName String 字段名
* @param fieldValue Object 字段值
* @throws NoSuchFieldException
* @throws SecurityException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
public static void setFieldValue(Object obj, String fieldName, Object fieldValue) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
Class<?> clazz = obj.getClass();
Field field = clazz.getField(fieldName);
field.set(obj, fieldValue);
}
public static void setFieldValueWithMethod(Object obj, String fieldName, Object fieldValue) throws IntrospectionException, IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException{
PropertyDescriptor pd = new PropertyDescriptor(fieldName, obj.getClass());
String writeMethodName = pd.getWriteMethod().getName();
execMethod(obj, writeMethodName, fieldValue);
}

/**
* 判断clsA是否和clsB是相同的类型或者超类型
* @param clsA Class
* @param clsB Class
* @return boolean
*/
public static boolean isSameOrSupperType(Class<?> clsA, Class<?> clsB){
if(!clsA.isPrimitive()&&!clsB.isPrimitive()){
return clsA.isAssignableFrom(clsB);
}
return isSameBasicType(clsA, clsB);
}

/**
* 判断clsA是否和clsB是相同的类型或者子类型
* @param clsA Class
* @param clsB Class
* @return boolean
*/
public static boolean isSameOrSubType(Class<?> clsA, Class<?> clsB){
if(!clsA.isPrimitive()&&!clsB.isPrimitive()){
return clsB.isAssignableFrom(clsA);
}
return isSameBasicType(clsA, clsB);
}

public static boolean isSameBasicType(Class<?> clsA, Class<?> clsB){
if(isIntType(clsA) && isIntType(clsB)){
return true;
}
if(isLongType(clsA) && isLongType(clsB)){
return true;
}
if(isBooleanType(clsA) && isBooleanType(clsB)){
return true;
}
if(isByteType(clsA) && isByteType(clsB)){
return true;
}
if(isCharType(clsA) && isCharType(clsB)){
return true;
}
if(isFloatType(clsA) && isFloatType(clsB)){
return true;
}
if(isDoubleType(clsA) && isDoubleType(clsB)){
return true;
}
if(isShortType(clsA) && isShortType(clsB)){
return true;
}
return false;
}

public static boolean isCharType(Class<?> clazz){
return Character.class.isAssignableFrom(clazz) || Character.TYPE.isAssignableFrom(clazz);
}
public static boolean isBooleanType(Class<?> clazz){
return Boolean.class.isAssignableFrom(clazz) || Boolean.TYPE.isAssignableFrom(clazz);
}
public static boolean isIntType(Class<?> clazz){
return Integer.class.isAssignableFrom(clazz) || Integer.TYPE.isAssignableFrom(clazz);
}
public static boolean isLongType(Class<?> clazz){
return Long.class.isAssignableFrom(clazz) || Long.TYPE.isAssignableFrom(clazz);
}
public static boolean isFloatType(Class<?> clazz){
return Float.class.isAssignableFrom(clazz) || Float.TYPE.isAssignableFrom(clazz);
}
public static boolean isDoubleType(Class<?> clazz){
return Double.class.isAssignableFrom(clazz) || Double.TYPE.isAssignableFrom(clazz);
}
public static boolean isByteType(Class<?> clazz){
return Byte.class.isAssignableFrom(clazz) || Byte.TYPE.isAssignableFrom(clazz);
}
public static boolean isShortType(Class<?> clazz){
return Short.class.isAssignableFrom(clazz) || Short.TYPE.isAssignableFrom(clazz);
}

public static Map<String, Object> describe(Object bean) throws IntrospectionException, IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException{
Map<String, Object> map = new LinkedHashMap<String, Object>();
PropertyDescriptor[] descriptors = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();
for(PropertyDescriptor descriptor : descriptors){
Method readMethod = descriptor.getReadMethod();
map.put(descriptor.getName(), execMethod(bean, readMethod.getName()));
}

return map;
}
public static String generatReadMethodName(Field field){
return generatReadMethodName(field.getName(), field.getType());
}
public static String generatReadMethodName(String fieldName, Class<?> fieldType){
if(isBooleanType(fieldType)){
return "is" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
}else{
return "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
}
}
public static String generatWriteMethodName(String fieldName){
return "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
}

public static StackTraceElement getCallerInfo(){
StackTraceElement[] elements = Thread.currentThread().getStackTrace();
StackTraceElement callerElement = elements[3];
return callerElement;
}

}


很强大的代码,调用Method.invoke()的时候入参类型怎么判断啊?
3 楼 yuancihang 2011-02-25  
package com.yuan.common.util;

import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* 反射工具类
* Class clazz = Class.forName("com.hxrainbow.util.ReflectUtil");
* Method[] methods1 = clazz.getMethods(); //获得所有的公有方法,包括从父类或者超类继承的方法
* Method[] methods2 = clazz.getDeclaredMethods(); //获得所有声明的方法(包括私有和受保护的方法), 不包括从父类或者超类继承的方法
* methods.toGenericString(); //返回描述此 Method 的字符串,包括类型参数.
* 字段和构造器的方法同上.
* @author 原此航
*
*/
public class ReflectUtil {

private static final Logger logger = LoggerFactory.getLogger(ReflectUtil.class);

/**
* 通过反射来执行公有方法
*
* 用法如下:
* Object obj = new Student();
* execMethod(obj, "setId", 20);
* execMethod(obj, "setName", "wang");
* int id = (Integer)execMethod(obj, "getId");
* String name = (String)execMethod(obj, "getName");
*
* @param obj Object
* @param methodName String
* @param params Object[]
* @return Object
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
public static Object execMethod(Object obj, String methodName, Object... params) throws NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
Object result = null;
Class<?> c = obj.getClass();
Class<?>[] parameterTypes = new Class<?>[]{};

if(params != null){
parameterTypes = new Class<?>[params.length];
for(int i=0;i<params.length;i++){
parameterTypes[i] = params[i].getClass();
}//for
}//if

Method m = getMethod(c, methodName, parameterTypes);
result =  m.invoke(obj, params);
return result;
}
public static Object execStaticMethod(Class<?> c, String methodName, Object... params) throws NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
Object result = null;
Class<?>[] parameterTypes = new Class<?>[]{};

if(params != null){
parameterTypes = new Class<?>[params.length];
for(int i=0;i<params.length;i++){
parameterTypes[i] = params[i].getClass();
}//for
}//if

Method m = getMethod(c, methodName, parameterTypes);
result =  m.invoke(null, params);
return result;
}

/**
* 通过类名来产生一个该类的实例.
* 用法 : String s = (String)newInstance("java.lang.String", "中国");
* @param className String 类全限定名
* @param initargs Object[] 构造函数需要的参数
* @return
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalArgumentException
*/
public static Object newInstance(String className, Object... initargs) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException{
Object instance = null;

Class<?> clazz = Class.forName(className);
Class<?>[] parameterTypes = null;

if(initargs != null){
parameterTypes = new Class<?>[initargs.length];
for(int i=0;i<initargs.length;i++){
parameterTypes[i] = initargs[i].getClass();
}//for
}//if
if((parameterTypes == null) || (parameterTypes.length == 0)){
instance = clazz.newInstance();
}else{
Constructor<?> constructor = getConstructor(clazz, parameterTypes);
instance = constructor.newInstance(initargs);
}
return instance;
}

public static <T extends Object> T newInstance(Class<T> clazz, Object... initargs) throws InstantiationException, IllegalAccessException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException{
T instance = null;

Class<?>[] parameterTypes = null;

if(initargs != null){
parameterTypes = new Class<?>[initargs.length];
for(int i=0;i<initargs.length;i++){
parameterTypes[i] = initargs[i].getClass();
}//for
}//if
if((parameterTypes == null) || (parameterTypes.length == 0)){
instance = clazz.newInstance();
}else{
Constructor<T> constructor = getConstructor(clazz, parameterTypes);
instance = constructor.newInstance(initargs);
}
return instance;
}

/**
* 根据形参查找合适的构造器
* @param <T>
* @param clazz Class<T>
* @param parameterTypes Class<?>[] 实参数组
* @return  Constructor<T>
*/
public static <T extends Object> Constructor<T> getConstructor(Class<T> clazz, Class<?>[] parameterTypes)throws NoSuchMethodException{

Constructor<T>[] allConstructors = (Constructor<T>[])clazz.getConstructors(); //找到所有构造函数

int parameterLen = parameterTypes.length; //实参个数
List<Constructor<T>> similarConstructorList = new ArrayList<Constructor<T>>(); //所有能够执行parameterTypes实参的构造函数
for(Constructor<T> constructor : allConstructors){
if(constructor.getParameterTypes().length == parameterLen){
boolean isSimilarType = true;
Class<?>[] formaParameterTypes = constructor.getParameterTypes(); //得到形参
for(int i=0; i<parameterLen; i++){
if(!isSameOrSupperType(formaParameterTypes[i], parameterTypes[i])){
isSimilarType = false;
break;
}
}
if(isSimilarType){
similarConstructorList.add(constructor);
}
}//if
}

if(similarConstructorList.isEmpty()){
throw new NoSuchMethodException("没有这样的构造函数.");
}

List<Integer> parameterMatchingCountList = new ArrayList<Integer>(); // 存放各个能够执行parameterTypes形参的构造函数对形参的严格匹配个数
for(Constructor<T> constructor : similarConstructorList){
int parameterMatchingCount = 0;
Class<?>[] formaParameterTypes = constructor.getParameterTypes();
for(int i=0; i<parameterLen; i++){
if(formaParameterTypes[i].getName().equals(parameterTypes[i].getName())){
parameterMatchingCount++;
}
}
parameterMatchingCountList.add(parameterMatchingCount);
}
int maxMatchingCountIndex = 0;
for(int i=1; i<parameterMatchingCountList.size(); i++){
if(parameterMatchingCountList.get(maxMatchingCountIndex).intValue() < parameterMatchingCountList.get(i).intValue()){
maxMatchingCountIndex = i;
}
}
return similarConstructorList.get(maxMatchingCountIndex); //
}

public static <T extends Object> List<Method> getMethods(Class<T> clazz, String methodName){
List<Method> methodList = new ArrayList<Method>();
Method[] allMethods = clazz.getMethods(); //找到所有方法
for(Method method : allMethods){
if(method.getName().equals(methodName)){
methodList.add(method);
}
}
return methodList;
}

/**
* 根据形参查找合适的方法
* @param <T>
* @param clazz Class<T>
* @param parameterTypes Class<?>[] 实参数组
* @return  Constructor<T>
*/
public static <T extends Object> Method getMethod(Class<T> clazz, String methodName, Class<?>[] parameterTypes)throws NoSuchMethodException{

Method[] allMethods = clazz.getMethods(); //找到所有方法

int parameterLen = parameterTypes.length; //实参个数
List<Method> similarMethodList = new ArrayList<Method>(); //所有能够执行parameterTypes实参的方法
for(Method method : allMethods){
if(!method.getName().equals(methodName)){
continue;
}
if(method.getParameterTypes().length == parameterLen){
boolean isSimilarType = true;
Class<?>[] formaParameterTypes = method.getParameterTypes(); //得到形参
for(int i=0; i<parameterLen; i++){
if(!isSameOrSupperType(formaParameterTypes[i], parameterTypes[i])){
isSimilarType = false;
break;
}
}
if(isSimilarType){
similarMethodList.add(method);
}
}//if
}

if(similarMethodList.isEmpty()){
StringBuilder sb = new StringBuilder();
sb.append(methodName);
sb.append("(");
if(AssertUtil.notEmpty(parameterTypes)){
StringBuilder parameterTypeBuilder = new StringBuilder();
for(Class<?> parameterType : parameterTypes){
parameterTypeBuilder.append(parameterType.getName()).append(",");
}
if(parameterTypeBuilder.charAt(parameterTypeBuilder.length() - 1) == ','){
parameterTypeBuilder = parameterTypeBuilder.deleteCharAt(parameterTypeBuilder.length() - 1);
}
sb.append(parameterTypeBuilder);
}
sb.append(")");
throw new NoSuchMethodException("没有这样的方法. " + sb.toString());
}

List<Integer> parameterMatchingCountList = new ArrayList<Integer>(); // 存放各个能够执行parameterTypes形参的方法对形参的严格匹配个数
for(Method method : similarMethodList){
int parameterMatchingCount = 0;
Class<?>[] formaParameterTypes = method.getParameterTypes();
for(int i=0; i<parameterLen; i++){
if(formaParameterTypes[i].getName().equals(parameterTypes[i].getName())){
parameterMatchingCount++;
}
}
parameterMatchingCountList.add(parameterMatchingCount);
}
int maxMatchingCountIndex = 0;
for(int i=1; i<parameterMatchingCountList.size(); i++){
if(parameterMatchingCountList.get(maxMatchingCountIndex).intValue() < parameterMatchingCountList.get(i).intValue()){
maxMatchingCountIndex = i;
}
}
return similarMethodList.get(maxMatchingCountIndex); //
}

/**
* 同过反射获得公有字段值
* @param obj Object
* @param fieldName String 字段名
* @return Object
* @throws NoSuchFieldException
* @throws SecurityException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
public static Object getFieldValue(Object obj, String fieldName) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
Object fieldValue = null;
Class<?> clazz = obj.getClass();
Field field = clazz.getField(fieldName);
fieldValue = field.get(obj);
return fieldValue;
}
public static Object getFieldValueWithMethod(Object obj, String fieldName) throws IntrospectionException, IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException{
PropertyDescriptor pd = new PropertyDescriptor(fieldName, obj.getClass());
String readMethodName = pd.getReadMethod().getName();
return execMethod(obj, readMethodName);
}

/**
* 通过反射设置公有字段值
* @param obj Object
* @param fieldName String 字段名
* @param fieldValue Object 字段值
* @throws NoSuchFieldException
* @throws SecurityException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
public static void setFieldValue(Object obj, String fieldName, Object fieldValue) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
Class<?> clazz = obj.getClass();
Field field = clazz.getField(fieldName);
field.set(obj, fieldValue);
}
public static void setFieldValueWithMethod(Object obj, String fieldName, Object fieldValue) throws IntrospectionException, IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException{
PropertyDescriptor pd = new PropertyDescriptor(fieldName, obj.getClass());
String writeMethodName = pd.getWriteMethod().getName();
execMethod(obj, writeMethodName, fieldValue);
}

/**
* 判断clsA是否和clsB是相同的类型或者超类型
* @param clsA Class
* @param clsB Class
* @return boolean
*/
public static boolean isSameOrSupperType(Class<?> clsA, Class<?> clsB){
if(!clsA.isPrimitive()&&!clsB.isPrimitive()){
return clsA.isAssignableFrom(clsB);
}
return isSameBasicType(clsA, clsB);
}

/**
* 判断clsA是否和clsB是相同的类型或者子类型
* @param clsA Class
* @param clsB Class
* @return boolean
*/
public static boolean isSameOrSubType(Class<?> clsA, Class<?> clsB){
if(!clsA.isPrimitive()&&!clsB.isPrimitive()){
return clsB.isAssignableFrom(clsA);
}
return isSameBasicType(clsA, clsB);
}

public static boolean isSameBasicType(Class<?> clsA, Class<?> clsB){
if(isIntType(clsA) && isIntType(clsB)){
return true;
}
if(isLongType(clsA) && isLongType(clsB)){
return true;
}
if(isBooleanType(clsA) && isBooleanType(clsB)){
return true;
}
if(isByteType(clsA) && isByteType(clsB)){
return true;
}
if(isCharType(clsA) && isCharType(clsB)){
return true;
}
if(isFloatType(clsA) && isFloatType(clsB)){
return true;
}
if(isDoubleType(clsA) && isDoubleType(clsB)){
return true;
}
if(isShortType(clsA) && isShortType(clsB)){
return true;
}
return false;
}

public static boolean isCharType(Class<?> clazz){
return Character.class.isAssignableFrom(clazz) || Character.TYPE.isAssignableFrom(clazz);
}
public static boolean isBooleanType(Class<?> clazz){
return Boolean.class.isAssignableFrom(clazz) || Boolean.TYPE.isAssignableFrom(clazz);
}
public static boolean isIntType(Class<?> clazz){
return Integer.class.isAssignableFrom(clazz) || Integer.TYPE.isAssignableFrom(clazz);
}
public static boolean isLongType(Class<?> clazz){
return Long.class.isAssignableFrom(clazz) || Long.TYPE.isAssignableFrom(clazz);
}
public static boolean isFloatType(Class<?> clazz){
return Float.class.isAssignableFrom(clazz) || Float.TYPE.isAssignableFrom(clazz);
}
public static boolean isDoubleType(Class<?> clazz){
return Double.class.isAssignableFrom(clazz) || Double.TYPE.isAssignableFrom(clazz);
}
public static boolean isByteType(Class<?> clazz){
return Byte.class.isAssignableFrom(clazz) || Byte.TYPE.isAssignableFrom(clazz);
}
public static boolean isShortType(Class<?> clazz){
return Short.class.isAssignableFrom(clazz) || Short.TYPE.isAssignableFrom(clazz);
}

public static Map<String, Object> describe(Object bean) throws IntrospectionException, IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException{
Map<String, Object> map = new LinkedHashMap<String, Object>();
PropertyDescriptor[] descriptors = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();
for(PropertyDescriptor descriptor : descriptors){
Method readMethod = descriptor.getReadMethod();
map.put(descriptor.getName(), execMethod(bean, readMethod.getName()));
}

return map;
}
public static String generatReadMethodName(Field field){
return generatReadMethodName(field.getName(), field.getType());
}
public static String generatReadMethodName(String fieldName, Class<?> fieldType){
if(isBooleanType(fieldType)){
return "is" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
}else{
return "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
}
}
public static String generatWriteMethodName(String fieldName){
return "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
}

public static StackTraceElement getCallerInfo(){
StackTraceElement[] elements = Thread.currentThread().getStackTrace();
StackTraceElement callerElement = elements[3];
return callerElement;
}

}

2 楼 yuancihang 2011-02-25  
package com.yuan.common.file;



public class FileUtil {

public static void writeToFile(String content, String fullPath)throws IOException{
writeToFile(content,fullPath,false,"UTF-8");
}

/**
* 将一个字符串写入一个文本文件中
* @param content String 要写入的字符串
* @param fullPath
* @param append boolean 是追加还是覆盖,true为追加
* @param encoding String 文本文件的编码
* @throws IOException
*/
public static void writeToFile(String content, String fullPath, boolean append, String encoding)throws IOException{
File parent = new File(new File(fullPath).getParent()); //得到父文件夹
if(!parent.exists()){
parent.mkdirs();
}
FileOutputStream fos = new FileOutputStream(new File(fullPath).getAbsolutePath(),append);
PrintWriter pw = new PrintWriter(new OutputStreamWriter(fos,encoding));
pw.print(content);
pw.close();
fos.close();
}


}
1 楼 liguirong98 2011-02-24  
大哥,你的这两个类呢?import com.yuan.common.file.FileUtil;
import com.yuan.common.util.ReflectUtil;

相关推荐

    DataBaseToJava:该工具将从数据库中生成Pojo类。您需要提供的只是数据库连接属性。

    自动化生成POJO类可以显著减少手动编写代码的工作量,降低错误率,提高开发效率。特别是在大型项目中,当数据库表数量庞大时,这个工具的价值更为明显。 6. **版本控制与持续集成** 生成的Java源码应纳入版本控制...

    mybatis根据表逆向生成pojo和mapper

    "mybatis根据表逆向生成pojo和mapper"是一个功能,可以帮助开发者快速地根据数据库中的表结构自动生成对应的Java实体类(POJO)和MyBatis的Mapper接口及XML映射文件,极大地提高了开发效率。 逆向工程(Reverse ...

    Mybatis生成pojo插件

    在配置完成后,点击“Finish”按钮,Mybatis Pojo插件会自动分析数据库中的表,根据配置生成对应的POJO类。这样,每次数据库结构发生变化时,只需要更新配置文件并重新生成,就可以快速同步到Java代码中。 总结一下...

    根据hibernate.cfg.xml文件生成POJO数据库表的工具类

    本篇文章将详细讲解如何根据`hibernate.cfg.xml`文件生成与数据库表对应的POJO(Plain Old Java Object)类,以简化开发过程。 首先,我们需要理解`hibernate.cfg.xml`文件的内容。这个文件通常包含数据库连接信息...

    MyBatis逆向工程生成pojo和mapper学习笔记

    运行Java文件后,MyBatis会根据配置生成对应的Java实体类(POJO)、Mapper接口以及Mapper XML文件。这些文件会被自动创建在我们之前配置的路径下。检查生成的代码,确保每个表都有对应的实体类和Mapper接口,且属性...

    hibernate生成pojo

    3. **选择数据库表生成POJO**: - 返回到“Database Explorer”视图,找到之前建立的数据库连接。 - 展开连接,选择需要生成POJO的表。 - 右键选择表,然后选择“Generate JPA 2.0 Entity Classes...”或类似的...

    mybatis-generator生成带中文注释POJO类的超详细教程含代码和图解

    MBG将根据`generatorConfig.xml`中的配置自动生成相应的POJO类、Mapper XML文件以及DAO接口。生成的代码会包含中文注释,这些注释可以帮助你更好地理解每个类和方法的作用。 最后,将生成的代码导入你的项目,就...

    发一个读取MySQL库,自动生成Pojo的工具

    总结起来,这个工具是一个基于Apache Ant的自动化解决方案,用于从MySQL数据库生成相应的Java POJO类。通过配置文件设置数据库连接参数,运行Ant脚本,即可自动生成与数据库表结构对应的Java实体类,方便进行数据...

    mybati自动生成mapper,dao,pojo

    MyBatis Generator会根据数据库表结构自动生成对应的POJO类,包含属性、getter和setter方法。 5. **mybatis-generator**:MyBatis Generator的主程序,它可以根据用户配置的XML配置文件,自动生成上述的Mapper接口...

    table2pojo:为数据库表列生成POJO

    表2 从数据库表/列生成POJO类的简单工具。 ### 支持所有JDBC支持的数据库。 包括以下JDBC驱动程序: OracleMySQL PostgreSQL可以在build.gradle文件中添加/更新JDBC驱动程序。建立使用gradle构建和组装具有依赖性的...

    mybatis自动生成pojo-dao-mapper工具

    这里的`jdbcConnection`元素设置了数据库连接信息,`javaModelGenerator`、`sqlMapGenerator`和`javaClientGenerator`分别定义了生成POJO、Mapper XML和DAO接口的路径和类型。 使用这个工具包时,你需要在当前目录...

    最新的mybatis 自动生成pojo mapper工具类

    标题提到的“最新的mybatis 自动生成pojo mapper工具类”就是这样一个工具,它的目的是帮助开发者自动生成与数据库表对应的Java实体类(POJO)和Mapper接口及其XML配置文件,从而减轻手动编码的工作量。 在使用这个...

    java小工具(批量产生代码,生成pojo,hibernate配置文件等)

    于是试着动手写了一个可以把数据库表自动写成pojo类,并且产生hibernate配置文件。虽然不是什么比较高级的程序,但是我希望也能对大家有一些帮助。不要吃我当时的闭门羹,算是给朋友们,提供一个思路吧。 备注:运行...

    通过mybatis generator反向工程生成pojo及mapper类 带序列化插件

    -- 这里指定生成POJO的包路径 --&gt; &lt;!-- 这里指定生成Mapper XML的包路径 --&gt; type="XMLMAPPER"&gt; &lt;!-- 这里指定生成Mapper接口的包路径 --&gt; enableUpdateByExample="false" enableDeleteByExample...

    mybatis逆向工程生成mysql数据库表的pojo,model,mapper的插件包

    Mybatis逆向工程是开发过程中一个非常实用的工具,它能帮助开发者自动生成与数据库表对应的Java实体类(POJO)、Model以及Mapper接口和XML配置文件,极大地提高了开发效率。这个插件包专为MySQL数据库设计,使得在...

    mybatis-mysql数据库生成mybatis相关文件xml、mapper、bean

    6. **Bean类(POJO)**:根据数据库表的字段生成的Java实体类,用于表示数据库中的记录。这些类通常包含getter和setter方法,方便属性的访问和设置。 7. **Ibatis到MyBatis的演变**:Ibatis是MyBatis的前身,是一个...

    mybatis自动生成dao pojo xml文件工具(SQL server)

    通过使用MyBatis的代码生成器,我们可以根据数据库表结构自动生成对应的DAO接口、实现类、POJO实体类以及对应的XML配置文件,大大减少了重复性工作。 首先,要使用MyBatis的代码生成器,你需要在项目中引入MyBatis...

    自动生成mybatis映射文件,mapper接口和pojo实体类

    运行后,你会在指定的输出目录看到自动生成的Mapper接口、Mapper XML文件以及与数据库表对应的POJO实体类。 Mapper接口定义了数据库操作的方法,这些方法对应于Mapper XML文件中的SQL语句。例如,`selectByExample`...

    MyBatis逆向工程生成工具

    2. 模型生成:逆向工程会根据数据库中的表结构生成对应的实体类(POJO)。实体类包含了表中的字段及其数据类型,每个字段通常会对应一个Java属性,数据类型根据数据库类型自动转换。 3. 接口生成:接着,逆向工程会...

    MyBatis的逆向工程详解

    逆向工程是MyBatis提供的一种功能,可以根据数据库表生成POJO对象和Mapper文件,极大的方便开发。使用MyBatis Generator可以根据数据库表逆向生成POJO对象和Mapper文件,从而极大的提高开发效率。 MyBatis ...

Global site tag (gtag.js) - Google Analytics