Создание любого вида объектов с использованием отражения - PullRequest
0 голосов
/ 18 октября 2011

Я пытаюсь написать программу Java, которая может создавать экземпляры различных объектов. Но я не знаю этих объектов, поэтому их нужно создавать динамически. Это хорошо работает с отражением, но у меня есть проблемы:

Я написал служебный класс, который содержит Map<Class, Object>. Эта карта содержит все примитивные типы, например

dummyValueMap.put(int.class, Integer.MIN_VALUE);

Так что я могу запросить фиктивный объект для int, чтобы использовать это значение в конструкторе объекта, который я не знаю во время компиляции, для создания экземпляра. Теперь моя проблема в том, что мне нужны фиктивные значения для примитивных типов, которые могут использоваться всеми конструкторами, поэтому Integer.MIN_VALUE или MAX_VALUE не очень хорошая идея. Кто-нибудь знает о лучших значениях для типов или есть специальные рамки?

Что я могу сделать, если параметром конструктора является интерфейс? Как получить реализацию этого интерфейса динамически?

Ответы [ 2 ]

1 голос
/ 18 октября 2011

Что касается примитивов, вы можете создать экземпляр соответствующего объекта и передать его конструктору, и с помощью магии автобоксирования / распаковки он будет работать (например, передать экземпляр Integer конструктору, который принимает аргумент int).

Для реализации реализаций интерфейса с помощью отражений это само по себе невозможно, но вы можете использовать такую ​​среду, как Mockito :

MyInterface myInterfaceImplementation = Mockito.mock(MyInterface.class);
0 голосов
/ 18 октября 2011

Это те вещи, которые вы должны обрабатывать сами: примитивные типы, типы интерфейсов, абстрактные типы ... Для любого заданного аргумента конструктора вы должны иметь возможность создавать и предоставлять значение, которое присваивается типу аргумента. Я не знаю каких-либо библиотек, которые могли бы помочь с этим, но я хотел бы, потому что я иногда делаю такие вещи. Неконкретные типы являются сложными, поскольку в Java нет (простого) способа поиска подтипов типа. В определенной степени вы можете создать какую-то карту «абстрактный тип к конкретному типу», где вы будете регистрировать такие вещи, как List => ArrayList и Set => HashSet. Затем ваш код может запросить, какой тип создать. Другими вариантами для обработки интерфейсов могут быть динамическое создание объекта реализации с использованием динамических прокси JDK или фиктивной инфраструктуры, такой как Mockito , и для обработки абстрактных классов Javassist , cglib или, опять же, Mockito.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...