Дополнительно
Что такое com.солнце.прокси.$Прокси
Я видел, что при возникновении ошибок в глубине различных механизмов (Эл.г рамках реализации спецификации EJB или некоторые поставщики СПД) трассировки стека содержат классы, как ком.солнце.прокси.$Прокси-сервер
. Я знаю, что такое прокси, но я ищу более технические и более Ява конкретный ответ.
- Каковы они?
- Как они создавались?
- Какое там отношение к JVM? Они JVM на конкретной реализации?
52
2
Прокси-классы, которые создаются и загружаются во время выполнения. Нет исходный код для этих классов. Я знаю, что вы задаетесь вопросом, как вы можете заставить их делать что-то, если нет кода для них. Ответ заключается в том, что при их создании можно указать объект, который реализует `InvocationHandler, который определяет метод, который вызывается, когда вызывается метод прокси.
Они создаются с помощью вызова
Прокси.newProxyInstance(загрузчик классов, интерфейсов, invocationHandler) Аргументы:
загрузчиком
. После того, как класс создан, он загружается с этого загрузчик класса.invocationHandler
. Это как ваш прокси-сервер не знает, что делать, когда метод вызывается. Это объект, который реализуетInvocationHandler
. Когда способ по любому из поддерживаемых интерфейсов, или хэш-код,
равна, или
метод toString, вызывается метод
вызовавызывается обработчик, передавая
метод` объект для метода, который будет вызван и аргументы.Подробнее об этом см. В документации
Прокси
класс.Каковы они?
Ничего особенного. Точно так же, как и общий экземпляр класса java.
Но эти класса являются синтетические прокси-классов, созданные
Ява.яз.отразить.Прокси#newProxyInstance
Какое там отношение к JVM? Они JVM на конкретной реализации?
Введен в 1.3
http://docs.oracle.com/javase/1.3/docs/relnotes/features.html#reflection
Она является частью Java. поэтому каждая JVM должны поддержать его.
Как они создавались (Openjdk7 источник)?
Короче : они созданы, чтобы использовать JVM АСМ-технология ( определение кода javabyte во время выполнения )
что-то, используя те же технологии:
Что происходит после вызова
Ява.яз.отразить.Прокси#newProxyInstance
получить
класса<?.generateProxyClass
, который возвращает байт[]Что происходит в магию солнца.накл.ProxyGenerator
нарисовать класс(байт-код), сочетая все методы в интерфейсах в одной
каждый метод построить с такой же байткод, как
сделать вызов метода мета информация (хранящаяся при генерации)
передать информацию в
обработчик вызова
'ывызвать()
получить возвращаемое значение от вызова обработчика
'ы
вызвать()`просто вернуть его
класс(байт-код) представляют в виде
байт[]
Как нарисовать класс
Думая, ваш коды Java компилируются в байткод, сделать это во время выполнения
Говорить это дешево показать вам код
основной метод в sun/misc/ProxyGenerator.java
generateClassFile
addProxyMethod
Полный код о Gen метод прокси