kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
Isaac Waller
Isaac Waller
Вопрос

Java Reflection: Создание реализующего класса

Class someInterface = Class.fromName("some.package.SomeInterface");

Как мне теперь создать новый класс, реализующий someInterface?

Мне нужно создать новый класс и передать его в функцию, которой нужен SomeInterface в качестве аргумента.

67 2009-07-04T19:41:31+00:00 4
Daniel Rikowski
Daniel Rikowski
Редактировал вопрос 4-го июля 2009 в 8:00
Программирование
interface
reflection
java
 Pacerier
Pacerier
6-го марта 2012 в 12:25
2012-03-06T12:25:19+00:00
Дополнительно
Источник
Редактировать
#9228765

Легко, Ява.яз.отразить.Доверенности на помощь!

Полный рабочий пример:

interface IRobot {

    String Name();

    String Name(String title);

    void Talk();

    void Talk(String stuff);

    void Talk(int stuff);

    void Talk(String stuff, int more_stuff);

    void Talk(int stuff, int more_stuff);

    void Talk(int stuff, String more_stuff);
}

public class ProxyTest {
    public static void main(String args[]) {
        IRobot robot = (IRobot) java.lang.reflect.Proxy.newProxyInstance(
                IRobot.class.getClassLoader(),
                new java.lang.Class[] { IRobot.class },
                new java.lang.reflect.InvocationHandler() {

            @Override
            public Object invoke(Object proxy, java.lang.reflect.Method method, Object[] args) throws java.lang.Throwable {
                String method_name = method.getName();
                Class<?>[] classes = method.getParameterTypes();

                if (method_name.equals("Name")) {
                    if (args == null) {
                        return "Mr IRobot";
                    } else {
                        return args[0] + " IRobot";
                    }
                } else if (method_name.equals("Talk")) {
                    switch (classes.length) {
                        case 0:
                            System.out.println("Hello");
                            break;
                        case 1:
                            if (classes[0] == int.class) {
                                System.out.println("Hi. Int: " + args[0]);
                            } else {
                                System.out.println("Hi. String: " + args[0]);
                            }
                            break;
                        case 2:
                            if (classes[0] == String.class) {
                                System.out.println("Hi. String: " + args[0] + ". Int: " + args[1]);
                            } else {
                                if (classes[1] == String.class) {
                                    System.out.println("Hi. int: " + args[0] + ". String: " + args[1]);
                                } else {
                                    System.out.println("Hi. int: " + args[0] + ". Int: " + args[1]);
                                }
                            }
                            break;
                    }
                }
                return null;
            }
        });

        System.out.println(robot.Name());
        System.out.println(robot.Name("Dr"));
        robot.Talk();
        robot.Talk("stuff");
        robot.Talk(100);
        robot.Talk("stuff", 200);
        robot.Talk(300, 400);
        robot.Talk(500, "stuff");
    }
}
 nazar_art
nazar_art
Редактировал ответ 19-го сентября 2015 в 8:59
75
0
Решение / Ответ
Jon Skeet
Jon Skeet
4-го июля 2009 в 7:53
2009-07-04T19:53:44+00:00
Дополнительно
Источник
Редактировать
#9228762

Создать нечто, претендующее на реализацию интерфейса на лету, на самом деле не так уж сложно. Вы можете использовать java.lang.reflect.Proxy после реализации InvocationHandler для обработки любых вызовов методов.

Конечно, вы можете создать настоящий класс с помощью библиотеки типа BCEL.

Если это делается в тестовых целях, то вам следует обратить внимание на такие мокинг-фреймворки, как jMock и EasyMock.

54
0
 jqno
jqno
4-го июля 2009 в 8:06
2009-07-04T20:06:25+00:00
Дополнительно
Источник
Редактировать
#9228763

Если вы хотите выйти за рамки интерфейсов, вам стоит обратить внимание на cglib и objenesis. Вместе они позволят вам делать довольно мощные вещи, расширяя абстрактный класс и инстанцируя его. (jMock использует их для этой цели, например).

Если вы хотите придерживаться интерфейсов, делайте то, что сказал Джон Скит :).

3
0
 nandokakimoto
nandokakimoto
4-го июля 2009 в 8:26
2009-07-04T20:26:56+00:00
Дополнительно
Источник
Редактировать
#9228764

На самом деле, вы должны использовать имя класса в методе Class.fromName() и привести его к типу вашего интерфейса. Посмотрите, поможет ли вам приведенный ниже пример.

public class Main {

    public static void main(String[] args) throws Exception {
        Car ferrari = (Car) Class.forName("Mercedez").newInstance();
        System.out.println(ferrari.getName());
    }
}

interface Car {
    String getName();
}

class Mercedez implements Car {

    @Override
    public String getName() {
        return "Mercedez";
    }

}

class Ferrari implements Car {

    @Override
    public String getName() {
        return "Ferrari";
    }

}
 nandokakimoto
nandokakimoto
Редактировал ответ 4-го июля 2009 в 9:01
-4
0
Похожие сообщества 11
pro.jvm
pro.jvm
5 817 пользователей
Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш канал: @proJVM Вакансии: @jvmjobs @jvmjobschat ⚠️ Оффтоп -> @flood ❌Переход на личности ❌Троллинг ❌Реклама ❌HH (вакансии) ❌Варез
Открыть telegram
learn.java
learn.java
5 372 пользователей
Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat
Открыть telegram
Java & Co
Java & Co
4 432 пользователей
Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/179171 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude
Открыть telegram
pro.JVM Jobs Chat
pro.JVM Jobs Chat
2 551 пользователей
Чат для обсуждения вакансий на JVM языках. Правила: - Никакого спама - Никакого троллинга и оскорблений участников - Размещение вакансий только через канал Канал для вакансий: @jvmjobs Основной чат: @jvmchat Наши друзья: @scala_jobs, @scala_jobs_feed
Открыть telegram
Java/Kotlin and more
Java/Kotlin and more
2 063 пользователей
чат о Java/Kotlin и связанных технологиях. We're discussing: job, tech questions etc. languages: russian, java, eng, kotlin Ссылка на чат: t.me/springframeworkio
Открыть telegram
Java Underground
Java Underground
1 751 пользователей
Библиотека по Java https://t.me/javalib Наше сообщество ВК: https://vk.com/javatutorial Вакансии и резюме свои строго в этот канал: https://t.me/job_java
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Денис Васьков
Зарегистрирован 16 часов назад
2
Dima Patrushev
Зарегистрирован 2 дня назад
3
sirojidddin otaboyev
Зарегистрирован 1 неделю назад
4
Елена Гайдамамакинат
Зарегистрирован 1 неделю назад
5
Иван Степанюк
Зарегистрирован 1 неделю назад
ID
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией