Статическое отражение Java — перечисление полей класса (предварительная компиляция)JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Статическое отражение Java — перечисление полей класса (предварительная компиляция)

Сообщение Anonymous »

Существует ли в Java тип отражения, который обеспечивает простое перечисление полей в классе?
В конце концов, эта информация является «статической перед компиляцией». Почему бы его не скомпилировать в класс?
Хотя я понимаю преимущества динамических возможностей, такой подход, как Reflection API, применяет к экосистеме, и действительно гениальное предвидение в развитии объектно-ориентированного мышления и импульс того, что стало удивительно гибкой JVM...
Но. В духе Java -параметры версии 8 и недавняя реализация проблем в собственной компиляции Graal, связанных с использованием Reflection API, почему бы не предоставить базовую жестко закодированную (легковесную) возможность «отражения» в качестве встроенного этапа компиляции для НЕКОТОРЫХ* метаданных, которые не мешают этой гениальности*, которые следует сохранить.
*размышление о наследовании и динамическом духе JVM
*хвастовство в адрес гений, создавший людей, индустрию и экосистему.
Выгоды от сопоставления POJO/ORM будут огромными.
кстати, процессоры аннотаций МОГУТ есть, но это противоположно духу этого вопроса. Как бы то ни было, вопрос может быть в духе, противоположном гению, который создал то, что мы имеем сегодня. Но я не думаю, что эта тема должна быть приглушена здесь.
В любом случае,
  • Хотим получить набор, определить подмножество и отфильтровать некоторые поля из множества всех (см. примеры)
  • и вызывайте геттеры/сеттеры, хотя и неклассические, посредством перечисления для ссылки на имя/тип/модификаторы поля).
например,o.setString(MyClass.Fields.AFIELD, value)


Выслушайте меня... хотя очевидно, что ICKY с разных точек зрения, с точки зрения ORM, существует примерно... 7 типов сеттеров нужен. Там, где ORM или http-params-to-Java составляет 80% кодовой базы, «теория против практики», более суровая реальность просто побеждает; Побеждает сегодня. и есть понимание того, почему он не побеждал в прошлом.

[*]любой < em>флаги компилятора, чтобы включить это? Плагины для javac?
[*]альтернативный javac? Я знаю, бууу.
[*]Это вообще не вопрос в свободном пространстве процессора аннотаций.

Практически, хотя я не являюсь «языковым существом» и знаю, что есть «причины»… но, как человек, просто работающий над какими-то высокоуровневыми отображениями ORM/http… не должен так ли это (добавлено около десяти лет назад)?
public class NiceClass {

//* NOTE this is not real java code today - don't copy and paste expecting it to work! */
static {

Set allMyFields = NiceClass.class.fieldz.public();
Set allMyLocalPublicFields = NiceClass.class.fieldz.local.public();

Set allMyLocalPrivateAndLocalProtectedFields = { Sets.union(
NiceClass.class.fieldz.local.private(),
NiceClass.class.fieldz.local.protected())}

Set specificFields = { Set.of(NiceClass.class.fields.ONE,
NiceClass.class.fields.THREE,
NiceClass.class.fields.FIVE )}

Set allFieldsWithoutLoggerByFieldName = {
NiceClass.class.fieldz.all().stream().filter(s-> s.name != "logger" ).collect(Collectors.toSet()) }

Set allFieldsWithoutLoggerByType = {
NiceClass.class.fieldz.all().stream().filter(s-> s.type != Logger.class ).collect(Collectors.toSet())
}

Set allNonTransientFields = {
NiceClass.class.fieldz.all().stream().filter(s-> s.modifier != Modifier.transient ).collect(Collectors.toSet())
}

Set holyGrailMySerialization = {
allFieldsWithoutLoggerByType.stream().filter(s-> s.access != private &&
! Modifiers.contains(Modifier.transient) &&
! Modifiers.contains(Modifier.volatile) &&
s.type != MyCredentials.class )
.collect(Collectors.toSet())

}

Set holyGrailMySerialization = {
holdGrailMySerialization.stream().filter(s-> ! s.annotations.contains(PrivateStuff.class) )
.collect(Collectors.toSet())

}

//and if you give the mouse a cookie...why shouldn't these be easy to "enable"?

public void set(Object.FieldInterface fieldEnum, Object value); //(casting in impl)

//and typesafe...
NiceClass.class.fieldz.stream().filter(
s->s.setterEnabled)
.map(s->s.type)
.collect(Collectors.toSet()).foreach(s->{

void set(fieldEnum, value);
}
})

//bonus to figure out how to reduce that param to what's *statically enabled*...

//I know this is wonky looking syntax ( a Set of types allowed in a generic? )
void set(Object.FieldInterface) fieldEnum, value);

//Anyways, the possibilties seem endless having this lightweight reflection...

}



Подробнее здесь: https://stackoverflow.com/questions/784 ... ompilation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»