Is there a better, more object oriented way to write this Finder method?
If you're going to hard-code conditions for each class you want to support, there isn't much point to using a generic type. You don't even reference T within the method body, so it isn't any different from:

private static String nameById(Class whatClass, int id) {
    if(ProjectCode.class == whatClass) {
        // ...
    } else if(TransactionType.class == whatClass) {
        // ...
    }
    else if(CurrencyType.class == whatClass) {
        // ...
    }
    return null;
}


To write this method so it's reusable with a generic type, you'll need to also abstract both your methods for obtaining a collection, and your getters for obtaining instances' name and Id.

e.g.


Some getObjects&lt;T&gt; method, called like getObjects&lt;TransactionType&gt;() instead of getTransactionTypes()
The ability to access object properties polymorphically, through some interface that requires each class to have getId() and getName() instead of separate methods such as getTransactionTypeId(), getProjCdId(), etc. 


Then your code could be rewritten to take advantage of a generic type parameter:

public static &lt;T extends IInterfaceName&gt; String nameByID(int id) {
    for (T obj : getObjects&lt;T&gt;()) {
        if(obj.getId().equals(id)) {
            return obj.getName();
        }
    }
    return null;
}