package cn.org.rapid_framework.generator.provider.java.model; import java.io.File; import java.io.IOException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import cn.org.rapid_framework.generator.util.IOHelper; import cn.org.rapid_framework.generator.util.StringHelper; import cn.org.rapid_framework.generator.util.paranamer.AdaptiveParanamer; import cn.org.rapid_framework.generator.util.paranamer.BytecodeReadingParanamer; import cn.org.rapid_framework.generator.util.paranamer.CachingParanamer; import cn.org.rapid_framework.generator.util.paranamer.DefaultParanamer; import cn.org.rapid_framework.generator.util.paranamer.JavaSourceParanamer; import cn.org.rapid_framework.generator.util.paranamer.Paranamer; public class MethodParameter { int paramIndex = -1; // paramIndex,从1开始 String paramName; //paramName名称 JavaClass paramClass; //parameter的类型 JavaMethod method; //与parameter相关联的method public MethodParameter(int paramIndex, JavaMethod method,JavaClass paramClazz) { super(); this.method = method; this.paramIndex = paramIndex; this.paramClass = paramClazz; } public JavaMethod getMethod() { return method; } public String getName() { if(paramIndex < 0) return null; String[] parameterNames = lookupParameterNamesByParanamer(); if(parameterNames == null || parameterNames.length == 0) { if(StringHelper.isNotBlank(paramName)) return paramName; if(paramClass.getClazz().isPrimitive() || paramClass.getClazz().getName().startsWith("java.")) { return "param"+paramIndex; }else { return StringHelper.uncapitalize(paramClass.getClassName()); } }else { return parameterNames[paramIndex - 1]; } } public static Paranamer paranamer = setParanamer(Thread.currentThread().getContextClassLoader()); public static Paranamer setParanamer(ClassLoader classLoader) { paranamer = new CachingParanamer(new AdaptiveParanamer(new DefaultParanamer(),new BytecodeReadingParanamer(),new JavaSourceParanamer(classLoader)) ); return paranamer; } private String[] lookupParameterNamesByParanamer() { return paranamer.lookupParameterNames(method.method,false); } public int getParamIndex() { return paramIndex; } public String getAsType() { return paramClass.getAsType(); } public String getClassName() { return paramClass.getClassName(); } public String getJavaType() { return paramClass.getJavaType(); } public String getPackageName() { return paramClass.getPackageName(); } public String getPackagePath() { return paramClass.getPackagePath(); } public String getParentPackageName() { return paramClass.getParentPackageName(); } public String getParentPackagePath() { return paramClass.getParentPackagePath(); } public boolean isArray() { return paramClass.isArray(); } public String getCanonicalName() { return paramClass.getCanonicalName(); } public List<JavaField> getFields() { return paramClass.getFields(); } public JavaMethod[] getMethods() { return paramClass.getMethods(); } public boolean isAnnotation() { return paramClass.isAnnotation(); } public boolean isAnonymousClass() { return paramClass.isAnonymousClass(); } public boolean isEnum() { return paramClass.isEnum(); } public boolean isInterface() { return paramClass.isInterface(); } public boolean isLocalClass() { return paramClass.isLocalClass(); } public boolean isMemberClass() { return paramClass.isMemberClass(); } public boolean isPrimitive() { return paramClass.isPrimitive(); } public boolean isSynthetic() { return paramClass.isSynthetic(); } public JavaProperty[] getProperties() throws Exception { return paramClass.getProperties(); } public String getSuperclassName() { return paramClass.getSuperclassName(); } public JavaClass getParamClass() { return paramClass; } public static String[] parseJavaFileForParamNames(Method method,File javaFile) throws IOException { String content = IOHelper.readFile(javaFile); return new JavaSourceFileMethodParametersParser().parseJavaFileForParamNames(method, content); } public static class JavaSourceFileMethodParametersParser { public String[] parseJavaFileForParamNames(Method method,String content) { Pattern methodPattern = Pattern.compile("(?s)"+method.getName()+"\\s*\\("+getParamsPattern(method)+"\\)\\s*\\{"); List<String> methodParams = new ArrayList(); Matcher m = methodPattern.matcher(content); List paramNames = new ArrayList(); while(m.find()) { for(int i = 1; i <= method.getParameterTypes().length; i++) { paramNames.add(m.group(i)); } return (String[])paramNames.toArray(new String[0]); } return null; } private String getParamsPattern(Method method) { List paramPatterns = new ArrayList(); for(int i = 0; i < method.getParameterTypes().length; i++ ) { Class type = method.getParameterTypes()[i]; String paramPattern = ".*"+type.getSimpleName()+".*\\s+(\\w+).*"; paramPatterns.add(paramPattern); } return StringHelper.join(paramPatterns, ","); } } public String toString() { return "MethodParameter:"+getName()+"="+getJavaType(); } }