Полевой класс
Класс поля определяет некоторые методы, которые можно использовать для запроса типа поля и для установки или считывания значения поля. Объединение этих методов с помощью метода наследуемого члена позволяет нам выяснить всю информацию о полевой объявлении и уметь манипулировать полями определенного объекта или класса.
Метод GetGenericType возвращает экземпляр типа, представляющий тип объявления поля. Для тривиальных типов, таких как String или Int, метод возвращает связанный с ним объект класса, такие как string.class и int.classo для параметризованных типов, таких как список <stri ng>, метод возвращает экземпляр параметризованного рипа, например, для такого типа, как t, метод возвращает экземпляр TipeVarariable.
Метод Legacy GetType вернет класс объекта типа поля. Для тривиальных типов метод ведет себя так же, как метод GetGenericType. Если объявленный тип поля является параметризованным типом, метод getType вернет соответствующий объект класса для стирания параметризованного типа, то есть объект класса исходного типа. Например, для объекта, объявленного списком <stri ng>, GetType вернет Li St. Class. Если объявленный тип поля является переменной типа, метод GetType вернет соответствующий объект класса для стирания переменной типа. Например, предположим, что есть класс Foo <ding>, и для поля объявлены типом t, получение объекта ype вернет.
класс объект. Если Foo объявлен как foo <evenends number>, то ype под get will wit wit wit wit wit return.class.
Мы можем использовать метод IsenumConstant для запроса, является ли поле постоянным перечислением, или мы можем использовать методы GET и установить для получения и установить значение поля. Эти методы, которые принимают ссылки на объект и возвращают значение ECT объекта, имеют общую форму, а также некоторые более специализированные формы, которые могут напрямую иметь дело с основными типами. Все эти методы принимают цитату, чтобы указать объект для работы. Для статических полей эта цитата объекта будет проигнорирована, поэтому вы также можете установить его
Установить на NULL. Следующий метод будет распечатать значение короткого поля объекта:
public static void printshortfield (объект O, название строки) бросает nosuchfieldexception, allodalaccessexception {field field = o.getClass (). getfield (имя); короткое значение = (короткое) поле. Get (O); System.out.println (значение);Возвращаемое значение метода GET может быть любым объектом, на который ссылаются это поле. Если поле является примитивным типом, метод вернет соответствующий тип объекта класса обертки. Для нашего поля Hort-Type метод GET возвращает объект типа, содержащий значение поля и при назначении значению локальной переменной, значение объекта будет автоматически распаковано.
Использование метода SET аналогично. Метод установки короткого поля на предоставленное значение может выглядеть следующим образом:
Public Static Voi SetShortfield (объект O, String name, Short NV) бросает NosuchfieldException, Field allogalAccessException Field = 0.getClass (). Getfield (имя); Field .set (o .nv);
Хотя SET принимает параметры типа объекта, мы можем напрямую передать короткое значение и обернуть его в короткий объект с преобразованием упаковки.
В приведенном выше методе, если домен указанного объекта недоступен, и этот контроль доступа применяется, будет выброшено исключение OldalAccessException; Если пройден объект отличается от типа домена, будет выброшено исключение allodalargumentException; Если домен не статичен, а ссылка на объект является нулевой, будет брошено исключение NullPointerException; Доступ к статическому домену может потребовать, чтобы класс был инициализирован, поэтому метод также выпустит исключение ExceptionInitializerRor.
Полевой класс также имеет конкретные методы для получения и установки основных типов. Например, мы можем вызвать getPrimity7Pe и установить Primitive7Pe на полевом объекте, где Primitive7Pe является (капитализированным) именем основного типа. Метод получения может быть использован в следующем операторе:
короткое значение = Field.getshhort (O);
Метод установки может быть использован в следующем операторе:
Field.setShort (O, NV);
Использование объектов типа обертки можно избежать в заявлениях, объявленных вышеупомянутыми двумя способами.
Полевой класс реализует интерфейс AnnotatedElement, поэтому мы также можем запросить его и применить его к домену, например, раздел 16.2.
Примечания на.
С помощью метода, описанного выше, мы можем использовать объект Field в качестве способа манипулировать любым значением, но мы должны попытаться избежать его. Поскольку Java Language захватывает ошибки программирования как можно большего, в течение периода компиляции программы, при записи кода используются меньше косвенных методов, таких как «объекты IELD», тем больше ошибок можно предотвратить, прежде чем они собирают их в код. Более того, мы видим, что в предыдущем коде, чтобы узнать, что именно произойдет, мы, очевидно, потратили гораздо больше энергии на код чтения, чем при использовании доменных имен непосредственно в обычном синтаксисе.
Последние поля
Обычно установление поля, объявленного окончательным
Исключение, это то, что мы можем ожидать, потому что значение окончательного поля никогда не изменится. Но есть некоторые особые случаи - например, в индивидуальной десериализации (см. Раздел 20.8.4) имеет смысл изменить значение конечного поля, которое мы можем достичь только посредством отражения на поле экземпляра, и только если на установке (TRUE) на объекте поле. Обратите внимание, что этого недостаточно, чтобы успешно вызовать SetAccessible (true), и это должно быть названо действительно.
Эта возможность предоставляется для высокоспециализированных контекстов и не для общего назначения, и мы представляем его для поддержания целостности только контента. Если вы находитесь вне определенного контекста, такого как индивидуальная десериализация, изменение значения конечного поля может привести к неожиданным или даже катастрофическим последствиям. За пределами этих контекстов нет никакой гарантии, что изменения в конечном поле видны. Даже в таких контекстах необходимо обеспечить, чтобы механизм безопасности не препятствовал выполнению кода при кодировании с использованием этой технологии. Изменение окончательного поля со значением постоянной переменной (см. Раздел 2.2.3) сделает это изменение невидимым, если такая модификация не будет достигнута с использованием отражения.
Метод класс
Класс метода и его унаследованные методы из класса участников позволяют нам получить полную информацию о объявлении метода:
"Публичный тип getGenericReturnTypeo: этот метод возвращает объект типа типа возврата целевого метода. Если целевой метод объявлен возвращением void, метод возвращает void.classo
«Публичный тип [] getGenericParameterTypes (): этот метод возвращает массив объектов типа всех типов параметров целевого метода, который будет храниться в массиве в порядке объявления параметров. Если целевой метод не имеет каких -либо параметров, метод возвращает пустую массив.
.publ IC Тип [] getGeneri Cacheti ontypes Q: Этот метод возвращает массив объектов типа всех типов исключений, перечисленных в предложении о бросках, который будет храниться в массиве в порядке объявления исключения.
Если целевой метод не объявляет никаких исключений, метод возвращает пустой массив.
Java также предоставляет методы getReturnType, getParameterTypes и getExceptionTypes для возврата Cl как «объект вместо объекта типа. Как и при использовании Field.getType, параметризованные и тип переменных представлены объектом класса, соответствующим их стиранию.
Метод класса реализует аннотационные элементы, и мы можем запросить аннотации, применяемые к методу, как обсуждается в разделе 16.2. Кроме того, класс метода также предоставляет getParameterannationations для обеспечения доступа к аннотациям, применяемым к параметрам метода. Метод GetParameterannotations может вернуть массив аннотации, где каждый элемент самого внешнего массива соответствует параметрам метода; Если параметр не имеет никаких аннотаций, метод возвращает массив аннотации длины 0 для этого параметра. Если метод, представленный объектом метода, сам по себе является элементом аннотации, то метод getDefaultValue вернет объект объекта, представляющий значение по умолчанию элемента; Если сам объект метода не является элементом аннотации или не имеет значения по умолчанию, то метод будет возвращать класс Null.method также реализует общий декларации, поэтому определяется метод getTypeParameters, что вернет массив объектов типов. Если заданный объект метода не представляет собой общий метод, метод возвращает пустой массив.
Мы можем использовать метод Isvarargs, чтобы проверить, является ли объект метода методом переменной индекса, и метод I Sbridge можно использовать для проверки того, является ли это методом моста
Наиболее интересный способ использовать объект метода - это отражать себя.
.public Object invoke (Object onThis, Object… Args) выбрасывает нелегалаксекции, нелегаларгументация, ArgetException в соответствии с Nvocation: Этот метод вызывает метод, определяемый объектом метода, и использует значение ARG для установки параметров вызываемого метода. Для нестатических методов фактический тип этого определяет, какую реализацию метода следует вызвать, в то время как для статических методов он будет игнорироваться и обычно устанавливается на NULL. Количество значений ARG должно быть таким же, как фактическое количество параметров вызываемого метода, и типы этих значений должны быть назначены параметрам вызываемого метода; В противном случае мы получим исключение LlegalargumentException. Обратите внимание, что последний параметр метода цитирования переменной - это массив, поэтому мы должны заполнить массив «изменчивыми» цитатами, которые мы на самом деле хотим пройти. Если мы хотим вызвать метод, который у нас нет доступа, метод будет выбросить исключение allodalaccessexception. Если вызываемый метод не является методом объекта ON, метод будет выбросить LlegalargumentExcepti на исключение. Если это является нулевым и нестативно, метод будет выбросить исключение № 1-точкового эктриэклекса. Если этот объект метода представляет собой статический метод, а класс, который объявляет, что статический метод все еще в состоянии инициализировался, метод будет выбросить исключение из исключительного работника Nitializererr. Если вызываемый метод обладает инопланетной силой, будет брошено исключение vocationTargetException.
Когда мы используем метод Invoke, мы можем напрямую передать основной тип, или мы можем использовать подходящий класс обертки. Тип, представленный классом обертки, должен быть назначен типу параметра, объявленного методом. Мы можем использовать Long, Float или Double, чтобы обернуть цитаты двойного типа, но мы не можем использовать двойные для обертывания длинных или плавучих цитат, потому что двойной не может быть назначен длинным или овсяным. Метод обработки объекта, возвращаемый методом Invoke, такой же, как Field.get, который возвращает основной тип класса обертки, соответствующий им. Если метод объявлен недействительным, метод вызова вернет нуль,
Проще говоря, когда мы используем Invoke для вызова методов, мы можем использовать только законные параметры только на языке Java.
Приоритеты с тем же типом и значением. Например, следующий вызов
вернуть str.indexof (".", 8);Это может быть записано в следующей форме, используя отражение:
Бросаемые Fas; try {method indexm = string.class. getMethod ("index0f", string.class, int.class); return (integer) indexm.invoke (str, ",", 8); } catch (nosuchmethodexception e) {affly = e; } catch (volcocationTargetException e) {fas = e .getCause (); } catch (allosalaccessexception e) {affly = e; } бросить Fas;Хотя проверки безопасности компилятора на наличие прямых вызовов могут выполняться только при использовании Invoke во время выполнения при использовании отражения, код на основе отражения имеет семантически эквивалентные проверки безопасности в код с прямым звеном. Проверки доступа могут быть выполнены немного по -другому - менеджер безопасности может отрицать доступ к методу в нашем пакете, даже если мы можем позвонить ему напрямую.
Когда мы можем использовать эту форму вызова, у нас есть веские основания, чтобы избежать этого. Но это будет иметь смысл, если мы используем метод Invoke или Get/Set при написании отладчика или другого общего приложения, которое необходимо интерпретировать ввод пользователя как операцию на объектах. Объект метода может использоваться в некоторой степени в качестве указателя метода, аналогичного тем, что на других языках, но у нас есть лучшие инструменты, особенно интерфейсы, абстрактные классы и вложенные классы, которые можно использовать для решения проблем, которые обычно решаются с указателями метода на других языках.