Политика хранения аннотаций Java [дубликат]

Главный ответ отличный. Вот что я должен был на обычной установке debian / php / mysql:

// storage
// debian. apparently already utf-8

// retrieval
// the mysql database was stored in utf-8, 
// but apparently php was requesting iso. this worked: 
// ***notice "utf8", without dash, this is a mysql encoding***
mysql_set_charset('utf8');

// delivery
// php.ini did not have a default charset, 
// (it was commented out, shared host) and
// no http encoding was specified in the apache headers.
// this made apache send out a utf-8 header
// (and perhaps made php actually send out utf-8)
// ***notice "utf-8", with dash, this is a php encoding***
ini_set('default_charset','utf-8');

// submission
// this worked in all major browsers once apache
// was sending out the utf-8 header. i didnt add
// the accept-charset attribute.

// processing
// changed a few commands in php, like substr,
// to mb_substr

, которая была всем!

20
задан vidit 14 June 2013 в 19:42
поделиться

4 ответа

Из всего большого количества библиотек, которые у меня есть в моем текущем проекте. единственные примеры, которые я могу найти, находятся в библиотеке Google Guava , например com.google.common.annotations.GwtCompatible .

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

9
ответ дан skaffman 25 August 2018 в 22:43
поделиться

Минимальный пример

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.CLASS)
@interface RetentionClass {}

@Retention(RetentionPolicy.RUNTIME)
@interface RetentionRuntime {}

public static void main(String[] args) {
    @RetentionClass
    class C {}
    assert C.class.getAnnotations().length == 0;

    @RetentionRuntime
    class D {}
    assert D.class.getAnnotations().length == 1;
}

Если мы используем javap в аннотированных классах, мы видим, что аннотированный класс Retention.CLASS получает атрибут класса RuntimeInvisible :

#14 = Utf8               LRetentionClass;
[...]
RuntimeInvisibleAnnotations:
  0: #14()

, в то время как аннотация Retention.RUNTIME получает атрибут класса RuntimeVisible :

#14 = Utf8               LRetentionRuntime;
[...]
RuntimeVisibleAnnotations:
  0: #14()

Таким образом, информация присутствует в обоих случаях в байт-коде.

Таким образом, Runtime.CLASS можно использовать для связывания произвольных метаданных с классом, который могут использоваться инструментами манипуляции с байт-кодом, без вмешательства в поведение во время работы.

Примеры в GitHub

g2] для игры.

1
ответ дан Ciro Santilli 新疆改造中心 六四事件 法轮功 25 August 2018 в 22:43
поделиться

КЛАСС Аннотации используются в инструментах обфускатора, таких как http://proguard.sourceforge.net . Например, аннотация @KeepName отключает манипулирование именами, когда вам нужно, чтобы ваше имя класса не изменялось, чтобы иметь возможность вызывать методы типа Class.forName ().

15
ответ дан Marek Fort 25 August 2018 в 22:43
поделиться

RetentionPolicy.CLASS полезны при выполнении постобработки на уровне кода байта.

Пример:

https://github.com/thesmythgroup/DroidCook/blob /master/src/org/tsg/android/api/Annotations.java

http://retroweaver.sourceforge.net/

4
ответ дан SANN3 25 August 2018 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: