package org.etk.reflect.api; import java.util.Arrays; import java.util.List; /** * Method signature define for MethodInfo. * * @author thanh_vucong * */ public class MethodSignature { private static final String[] NO_PARAMETERS = new String[0]; private final String name; private final String[] parameterRawNames; /** * * * @param name * @param parameterTypes */ public MethodSignature(String name, Class<?>... parameterTypes) { if (name == null) { throw new NullPointerException("No null name accepted"); } if (parameterTypes == null) { throw new NullPointerException("No null name accepted"); } String[] parameterRawNames; if (parameterTypes.length == 0) { parameterRawNames = NO_PARAMETERS; } else { parameterRawNames = new String[parameterTypes.length]; for (int i = 0; i < parameterTypes.length; i++) { Class<?> parameterType = parameterTypes[i]; if (parameterType == null) { throw new IllegalArgumentException("Not null parameter type allowed"); } parameterRawNames[i] = parameterType.getName(); } } this.name = name; this.parameterRawNames = parameterRawNames; } public MethodSignature(String name, List<TypeInfo> parameterTypes) { if (name == null) { throw new NullPointerException("No null name accepted"); } if (parameterTypes == null) { throw new NullPointerException("No null name accepted"); } // String[] parameterRawNames; if (parameterTypes.size() == 0) { parameterRawNames = NO_PARAMETERS; } else { parameterRawNames = new String[parameterTypes.size()]; int j = 0; for (TypeInfo parameterType : parameterTypes) { if (parameterType == null) { throw new IllegalArgumentException( "No null parameter type allowed"); } parameterRawNames[j++] = computeRawName(parameterType); } } // this.name = name; this.parameterRawNames = parameterRawNames; } public String getName() { return name; } private String computeRawName(TypeInfo type) { if (type instanceof ClassTypeInfo) { return ((ClassTypeInfo) type).getName(); } else if (type instanceof ParameterizedTypeInfo) { return computeRawName(((ParameterizedTypeInfo) type).getRawType()); } else if (type instanceof TypeVariableInfo) { return computeRawName(((TypeVariableInfo) type).getBounds().get(0)); } else if (type instanceof ArrayTypeInfo) { return "[L" + computeRawName(((ArrayTypeInfo) type).getComponentType()) + ";"; } else { throw new AssertionError(); } } @Override public int hashCode() { return name.hashCode() ^ Arrays.hashCode(parameterRawNames); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj instanceof MethodSignature) { MethodSignature that = (MethodSignature) obj; return name.equals(that.name) && Arrays.equals(parameterRawNames, that.parameterRawNames); } return false; } @Override public String toString() { return "MethodSignature[name=" + name + ",parameterRawNames=" + Arrays.toString(parameterRawNames) + "]"; } }