InitialContext не просто выбирает хост по умолчанию (localhost) и номер порта по умолчанию. Эта информация явно задана самой стеклянной фишкой, которая выполняется с использованием технологии Java Webstart.
Вы можете протестировать его самостоятельно: предположим, что клиент вашего приложения развернут в контексте localhost:8080/YourClient
. Когда вы переходите к ссылке, файл JNLP загружается и запускается через Webstart. Вы можете вручную сохранить файл, а не открывать его автоматически (например, wget localhost:8080/YourClient
на Linux).Вы увидите, что Glassfish инициализирует ваше клиентское приложение с большим количеством параметров, включая свойства JNDI, связанные с:
<property name="java.naming.factory.initial" value="com.sun.enterprise.naming.SerialInitContextFactory"/>
<property name="java.naming.factory.url.pkgs" value="com.sun.enterprise.naming"/>
<property name="java.naming.factory.state" value="com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl"/>
<property name="appclient.iiop.defaultHost" value="localhost"/>
<property name="appclient.iiop.defaultPort" value="${request.appclient.iiop.defaultPort}"/>
<property name="${appclient.download.host.propertyName}" value="localhost"/>
<property name="${appclient.user.code.is.signed.propertyName}" value="${appclient.user.code.is.signed}"/>
Эти свойства не только указаны для вашего удобства, они являются обязательными. Попробуйте запустить клиентское приложение как отдельное приложение (просто запустите основной класс в своей любимой среде IDE): в такой ситуации исходные параметры не будут установлены. Вы заметите, что InitialContext не работает так хорошо без этих свойств.
Короткий ответ на ваш вопрос: InitialContext находит Glassfish и EJB, потому что ваше приложение было запущено со специальными параметрами говорить InitialContext, где искать, как инициализировать необходимые классы и т.д.
Это не «найти класс Java. Он находит объект Java *, * по имени, в пространстве имен. – EJP