public ClassProperties(Class clazz) { methods = Multimaps.newListMultimap( new TreeMap<>(String.CASE_INSENSITIVE_ORDER), () -> new ArrayList<>()); getters = Multimaps.newListMultimap( new TreeMap<>(String.CASE_INSENSITIVE_ORDER), () -> new ArrayList<>()); setters = Multimaps.newListMultimap( new TreeMap<>(String.CASE_INSENSITIVE_ORDER), () -> new ArrayList<>()); for (Method method : clazz.getMethods()) { final String name = method.getName(); methods.put(name, method); final Class<?>[] params = method.getParameterTypes(); if ((name.startsWith("get") || name.startsWith("is") || COMMON_DERIVED_PROPERTIES.contains(name)) && params.length == 0) { getters.put(gp(method), method); } else if (name.startsWith("set") && params.length == 1) { setters.put(name.substring(3), method); } } // avoid keeping lots of useless empty arrays in memory for // the long term, use just one if (methods.size() == 0) methods = EMPTY; if (getters.size() == 0) getters = EMPTY; if (setters.size() == 0) setters = EMPTY; }