
com.yiwowang.intellij.finding.base.bean.MemberBean Maven / Gradle / Ivy
The newest version!
package com.yiwowang.intellij.finding.base.bean;
import org.apache.commons.lang3.StringUtils;
public class MemberBean {
public static final int TYPE_METHOD = 1;
public static final int TYPE_FIELD = 2;
public int type;
public ClassBean clazz;
/**
* bytecode sign
*/
public String sign;
public String name;
private String displayName;
private String inputFormatName;
public String getInputFormatName() {
if (inputFormatName != null) {
return inputFormatName;
}
switch (type) {
case TYPE_METHOD:
inputFormatName = name + parseMethodSignature2(sign);
break;
case TYPE_FIELD:
inputFormatName = name;
break;
}
return inputFormatName;
}
public String getDisplayName() {
if (displayName != null) {
return displayName;
}
switch (type) {
case TYPE_METHOD:
displayName = name + parseMethodSignature(sign);
break;
case TYPE_FIELD:
displayName = name;
break;
}
return displayName;
}
public static String parseMethodSignature(String sign) {
// delete return value
int typeEnd = sign.lastIndexOf(")");
if (typeEnd <= 1) {
return "()";
}
String paramsStr = sign.substring(1, typeEnd - 1);
// 基本类型+引用类型
StringBuilder builder = new StringBuilder(" (");
int defaultLength = builder.length();
String[] paramsArr = paramsStr.split(";");
for (int i = 0; i < paramsArr.length; i++) {
String param = paramsArr[i];
if (param == null || param.length() == 0) {
continue;
}
int arrNum = 0;
char[] chars = param.toCharArray();
for (int k = 0; k < chars.length; k++) {
char c = chars[k];
if (c == '[') {
arrNum++;
continue;
}
String baseType = getBaseType(c);
if (baseType != null) {
// 参数之间分隔
if (builder.length() > defaultLength) {
builder.append(", ");
}
// 数组类型
builder.append(baseType);
appendArrNum(builder, arrNum);
} else if (c == 'L') {
String refClass = param.substring(k);
String className = getClassName(refClass);
if (className.length() > 0) {
// 参数之间分隔
if (builder.length() > defaultLength) {
builder.append(", ");
}
builder.append(className);
appendArrNum(builder, arrNum);
}
break;
}
arrNum = 0;
}
}
builder.append(")");
return builder.toString();
}
public static String parseMethodSignature2(String sign) {
// delete return value
int typeEnd = sign.lastIndexOf(")");
if (typeEnd <= 1) {
return "()";
}
String paramsStr = sign.substring(1, typeEnd - 1);
// 基本类型+引用类型
StringBuilder builder = new StringBuilder(" (");
int defaultLength = builder.length();
String[] paramsArr = paramsStr.split(";");
for (int i = 0; i < paramsArr.length; i++) {
String param = paramsArr[i];
if (param == null || param.length() == 0) {
continue;
}
int arrNum = 0;
char[] chars = param.toCharArray();
for (int k = 0; k < chars.length; k++) {
char c = chars[k];
if (c == '[') {
arrNum++;
continue;
}
String baseType = getBaseType(c);
if (baseType != null) {
// 参数之间分隔
if (builder.length() > defaultLength) {
builder.append(", ");
}
// 数组类型
builder.append(baseType);
appendArrNum(builder, arrNum);
} else if (c == 'L') {
String refClass = param.substring(k);
if (refClass.length() > 0) {
// 参数之间分隔
if (builder.length() > defaultLength) {
builder.append(", ");
}
builder.append(refClass.substring(1).replace("/", "."));
appendArrNum(builder, arrNum);
}
break;
}
arrNum = 0;
}
}
builder.append(")");
return builder.toString();
}
/**
* @param refClass Ljava/lang/Object
* @return
*/
private static String getClassName(String refClass) {
if (refClass == null || refClass.length() < 2) {
return "";
}
int pos = refClass.lastIndexOf("/");
if (pos < 0) {
pos = 1;
}
return refClass.substring(pos + 1);
}
private static void appendArrNum(StringBuilder builder, int arrNum) {
// 数组维数
if (arrNum > 0) {
for (int j = 0; j < arrNum; j++) {
builder.append("[]");
}
}
}
private static String getBaseType(char c) {
switch (c) {
case 'C':
return "char";
case 'Z':
return "bool";
case 'S':
return "short";
case 'I':
return "int";
case 'J':
return "long";
case 'F':
return "float";
case 'D':
return "double";
case 'V':
return "void";
}
return null;
}
public static String getSignFromInput(String paramsType) {
String[] types = StringUtils.substringBetween(paramsType, "(", ")").split(",");
StringBuilder builder = new StringBuilder("(");
for (String type : types) {
builder.append(typeAsSignature(type));
}
builder.append(")");
return builder.toString();
}
public static String typeAsSignature(String type) {
if (StringUtils.isEmpty(type)) {
return "";
}
StringBuilder builder = new StringBuilder();
// 数组转换
int arrayStart = type.indexOf("[");
if (arrayStart > 0) {
String arrayType = type.substring(arrayStart).replace("]", "");
builder.append(arrayType);
type = type.substring(0, arrayStart);
}
switch (type) {
case "char":
builder.append("C");
break;
case "bool":
case "boolean":
builder.append("Z");
break;
case "short":
builder.append("S");
break;
case "int":
builder.append("I");
break;
case "long":
builder.append("J");
break;
case "float":
builder.append("F");
break;
case "double":
builder.append("D");
break;
case "void":
builder.append("V");
break;
default:
if (type.contains(".")) {
builder.append("L")
.append(type.replace(".", "/"))
.append(";");
} else {
builder.append("Ljava/lang/Object;");
}
break;
}
return builder.toString();
}
@Override
public String toString() {
return getDisplayName();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy