Если вы загружаете класс через отражение, это происходит потому, что вы не знаете фактический класс во время компиляции, как видно из комментария (в другом ответе):
Class c = loadClass("Foo");
Foo f = (Foo) c.newInstance();
не имеет смысла, так как Foo статически доступен в пути к классам, просто выполните
Foo f = new Foo();
Опять вы используете рефлексию, когда у вас нет статически связанного доступа к классу. (или не знаю, делаете ли вы это или нет). Подумайте над этим:
Класс, определенный как
public class Foo implements SomeInterface {
public void fah() {
System.out.println("blah");
}
}
Теперь получите доступ к этому классу Foo через отражение, но держитесь за него как за SomeInterface
объектом.
Class c = loadClass("Foo");
SomeInterface i = (SomeInterface)c.newInstance();
Здесь у меня есть SomeInterface, который реализован "Foo". Мой код скомпилирован с SomeInterface, поэтому я могу ссылаться на методы, определенные в интерфейсе, но я понятия не имею, что такое класс реализации "Foo", кроме как по имени.