2013-09-13 3 views
4

Если у меня есть два приложения java, работающих на tomcat. Приложения A и B. У меня есть открытый класс со статической переменной в приложении A, тогда приложение B может получить к нему доступ. Если нет, то почему?Несколько приложений на tomcat

Меня спрашивали в интервью. Я сказал, что не может получить доступ. Но я не знал, почему?

Может кто-нибудь помочь с правильным ответом.

ответ

4

Поскольку каждое приложение имеет свой собственный загрузчик классов, хотя JVM такой же. Дополнительная информация о загрузчике классов: What is a Java ClassLoader?

1

В каждой войне приложений есть отдельный загрузчик классов, поэтому нет, они не могут обращаться к другим методам.

Однако это может быть сделано с использованием чего-то вроде RMI или некоторой веб-службы HTTP.

0

Поскольку каждый WebApp выделяет свои собственные загрузчики классов (система Tomcat).

Ваш точный вопрос о static:

Ключ, как загрузчиков классов структурированы. Вполне возможно, что для двух классов ClassLoaders в пределах одной JVM каждый загружает класс и, следовательно, содержит отдельные независимые копии статических полей.

Предпочитаю читать: Classloader behaviour on Tomcat with multiple applications

-2

Это зависит от многого. Вопрос не достаточно ясен, чтобы дать ответ «да/нет», на мой взгляд.

Если приложение каким-то образом предоставляет переменную, то, естественно, другие приложения могут просто попросить получить значение. Но это маловероятно, на что должен был быть поставлен вопрос. Но имейте это в виду. В интервью мне всегда было приятно доказать, что вы можете мыслить критически и вне коробки.

Я думаю, они хотели видеть, поняли ли вы концепцию статических переменных и ClassLoader. Java-приложение динамически связано, что означает, что во время выполнения ClassLoader (в зависимости от приложения) будет выполнять связывание, загрузку всех библиотек или делегирование загрузки. Статические переменные называются классом. Если вы попытаетесь получить доступ к статической переменной, класс 'ClassLoader попытается найти и загрузить класс. Поскольку каждое приложение имеет свой собственный ClassLoader, каждое приложение имеет свой собственный набор переменных.

Это не похоже на принцип разделения адресного пространства, найденного на более старых языках. Приложение работает в отдельном адресном пространстве, даже если оно размещено на одном компьютере. Таким образом, два приложения, работающие рядом друг с другом, не могут просто обращаться к переменным в адресном пространстве другого приложения, поскольку это будет нарушать ограничение, которое применяется несколькими сторожевыми псами. Но будьте осторожны, адресное пространство может быть разделено явно.

+0

Было бы полезно получить комментарий с отрицательным голосом, чтобы я мог понять, что не так с моим ответом. – Eric

0

Позвольте мне поставить его максимально простым способом.

Qusetion: Как получить доступ к статической переменной? Это, безусловно, использует имя класса.

У нас есть class, как показано ниже:

package com.package1; 

public ClassA { 
    public static String GLOBAL_VARIABLE= "TEST"; 
} 

Вопрос: Как JVM увидеть CLASSA. Ответ: Он видит, как ClassLoaderForA.com.package1.ClassA

Предполагая, что это был загружен с помощью класса загрузчик Application1

Теперь для загрузчика классов второго приложения, то ClassA не существует. Он не найдет его. Так как это может получить статическое поле от ClassA

Смежные вопросы