2011-01-27 2 views
1

Мне интересно, есть ли способ достичь следующего.Как сделать любой Java-метод статическим во время выполнения?

  1. найти метод, используя отражение (сделано)
  2. Измените метод Модификатор доступа к общественности и статичным. (Как?)
  3. выполнить этот метод без какого-либо существующего экземпляра (Как?)

ли имеет какой-либо вариант, чтобы сделать отражение это?

+2

Ненавижу, когда люди реагируют так, как я буду делать сейчас, но почему вы хотите это сделать? –

+2

@ Виктор: Я думаю «почему?» является вполне разумным комментарием. –

+0

@ vector; У меня есть API, мне нужно выполнить метод одного из классов в API. Этот класс является окончательным, и процесс создания объекта очень дорог (у меня даже нет доступа ко всем требуемым ресурсам). Поэтому мне было интересно, может ли это быть вариантом. –

ответ

3

Нет, это совершенно невозможно и не имеет никакого смысла. Метод экземпляра имеет доступ к (и обычно использует) переменные экземпляра. Что должно быть, например, типичный набор или метод get, который был «сделан статическим», возможно?

1

Это не имеет никакого смысла. Нестатический метод нестационарен по какой-либо причине, поскольку ему необходимо получить доступ к элементам данных , относящимся к конкретному экземпляру класса. Как бы вы преобразовали это в статику?

0

№ Вы не можете изменить класс с отражением. Вы можете просто осмотреть его.

0

Я не думаю, что это возможно.

Если ваш метод использует ссылку «this», это будет неопределенное поведение.

1

Даже если вы использовали инструменты, позволяющие вам изменить класс (например, BCEL), вы все равно ничего бы не достигли, потому что (все второстепенные предостережения) в тот момент, когда вы меняете метод из метода экземпляра в static, весь код называя это бросит NoSuchMethodError. Причина в том, что при вызове метода static/instance используется два разных кода операций.

+0

Кроме того, вы не можете автоматически ставить метод static. Статический метод не может вызывать другие нестатические методы или переменные. Поэтому, чтобы быть в безопасности, вы должны изменить все методы на статичные. Но что вы достигнете в этом случае? Тот же эффект дает просто создание экземпляра и вызов его нестатических методов. – AlexR

+0

@AlexR: >> Кроме того, вы не можете автоматически ставить метод static <<. Технически вы можете во время загрузки класса изменять подписи или добавлять статический метод. Но нестатические методы имеют больше параметров, а aload0 - это «это». – bestsss

+0

@AlexR Это то, что я эвфемистически обозначил как «незначительные оговорки». Но вы правы, есть тысячи причин, почему это не сработает. – biziclop

0

Как все сказано, это плохо и не должно быть сделано.

Но опять же, если вам нужно это достичь, и вы уже дали причину, поэтому мне бы хотелось попробовать что-то другое, чтобы достичь этого.
Я мог бы создать одноэлементный класс и предоставить статический метод (фасад) для доступа к требуемому методу API и всегда следить за тем, чтобы все остальные классы использовали этот метод singleton class для доступа к API-методу.

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