package org.t2framework.confeito.model; import java.lang.reflect.Method; import java.util.HashSet; import java.util.Set; import org.t2framework.confeito.Constants; public class Ignore { String methodName; Class<?>[] args; Class<?> returnType; protected static Set<Ignore> DEFAULT_IGNORES = new HashSet<Ignore>(); public Ignore(String methodName, Class<?>[] args, Class<?> returnType) { this.methodName = methodName; this.args = args; this.returnType = returnType; } private static void init() { DEFAULT_IGNORES.add(new Ignore("wait", Constants.EMPTY_CLASS_ARRAY, Void.TYPE)); DEFAULT_IGNORES.add(new Ignore("wait", new Class<?>[] { Long.TYPE, Integer.TYPE }, Void.TYPE)); DEFAULT_IGNORES.add(new Ignore("wait", new Class<?>[] { Long.TYPE }, Void.TYPE)); DEFAULT_IGNORES.add(new Ignore("hashCode", Constants.EMPTY_CLASS_ARRAY, Integer.TYPE)); DEFAULT_IGNORES.add(new Ignore("getClass", Constants.EMPTY_CLASS_ARRAY, Class.class)); DEFAULT_IGNORES.add(new Ignore("equals", new Class<?>[] { Object.class }, Boolean.TYPE)); DEFAULT_IGNORES.add(new Ignore("toString", Constants.EMPTY_CLASS_ARRAY, String.class)); DEFAULT_IGNORES.add(new Ignore("notify", Constants.EMPTY_CLASS_ARRAY, Void.TYPE)); DEFAULT_IGNORES.add(new Ignore("notifyAll", Constants.EMPTY_CLASS_ARRAY, Void.TYPE)); DEFAULT_IGNORES.add(new Ignore("finalize", Constants.EMPTY_CLASS_ARRAY, Void.TYPE)); DEFAULT_IGNORES.add(new Ignore("clone", Constants.EMPTY_CLASS_ARRAY, Object.class)); DEFAULT_IGNORES.add(new Ignore("registerNatives", Constants.EMPTY_CLASS_ARRAY, Void.TYPE)); } public static boolean isIgnorableMethod(final Method m) { if (DEFAULT_IGNORES.isEmpty()) { init(); } if (m.isBridge() || m.isSynthetic()) { return true; } for (Ignore i : DEFAULT_IGNORES) { final String name = m.getName(); if (name.equals(i.methodName) == false) { continue; } final Class<?>[] parameterTypes = m.getParameterTypes(); final Class<?> returnType = m.getReturnType(); if (i.returnType.equals(returnType) && parameterEquals(i.args, parameterTypes)) { return true; } } return false; } private static boolean parameterEquals(Class<?>[] args, Class<?>[] parameterTypes) { if (args.length != parameterTypes.length) { return false; } for (int i = 0; i < args.length; i++) { if (args[i] != parameterTypes[i]) { return false; } } return true; } }