 <p>Reflection is rarely the correct answer to anything. Consider having your enum classes implement a common interface, like <a href="http://docs.oracle.com/javase/8/docs/api/java/nio/file/StandardCopyOption.html" rel="nofollow">StandardCopyOption</a> and <a href="http://docs.oracle.com/javase/8/docs/api/java/time/Month.html" rel="nofollow">Month</a> do.</p> <p>If you can't modify the enum classes, and if you're using Java 8, you can pass the getter method as an argument:</p> <pre><code>public &lt;E extends Enum&lt;E&gt;&gt; E findMatch(Class&lt;E&gt; enumClass, Function&lt;E, String&gt; nameGetter, Predicate&lt;String&gt; matcher) { for (E value : EnumSet.allOf(enumClass)) { String name = nameGetter.apply(value); if (matcher.test(name)) { return value; } } return null; } </code></pre> <p>Example usage:</p> <pre><code>public static enum Season { SPRING("Spr"), SUMMER("Sum"), FALL("Fal"), WINTER("Win"); private final String abbreviation; private Season(String abbrev) { this.abbreviation = abbrev; } public getAbbreviation() { return abbreviation; } } public void doStuff() { // ... String abbrToFind = "Sum"; Season match = findMatch(Season.class, Season::getAbbreviation, Predicate.isEqual(abbrToFind)); } </code></pre> <p>If you're using a version older than Java 8, you can still do the same thing, but you'll need to define and implement the interfaces yourself:</p> <pre><code>public interface Function&lt;A, B&gt; { B apply(A input); } public interface Predicate&lt;T&gt; { boolean test(T value); } public void doStuff() { // ... final String abbrToFind = "Sum"; Season match = findMatch(Season.class, new Function&lt;Season, String&gt;() { @Override public String apply(Season season) { return season.getAbbreviation(), } }, new Predicate&lt;String&gt;() { @Override public boolean test(String name) { return Objects.equals(name, abbrToFind); } }); } </code></pre>