получение объекта метода для класса с проверкой времени компиляции (в Java) - PullRequest
4 голосов
/ 05 августа 2011

Я хотел бы получить объект Method, подобный этому:

Method myMethod = MyClass.class.getDeclaredMethod("myDeclaredMethod",Arg1Class.class);

Но! Я хотел бы проверить время компиляции существования метода "myDeclaredMethod". На самом деле мне не нужно динамически выбирать метод, мне просто нужна ссылка на него, чтобы я мог передать его другому методу ... аналогично тому, как в С есть указатели на функции. Я хотел бы сделать что-то вроде этого:

#include <stdio.h>

void helloWorld() {
    printf("hello\n");
}

void runFunction( void (myfunc)() ) {
    myfunc();
}

int main() {
    runFunction(helloWorld);
    return 0;
}

Обратите внимание, что если я неправильно набрал "helloWorld" в вызове "runFunction (helloWorld)", я получил ошибку во время компиляции. Я хочу, чтобы та же самая ошибка времени компиляции в Java, если возможно.

Ответы [ 3 ]

2 голосов
/ 05 августа 2011

Боюсь, что вы не можете сделать это в Java.

Однако обычный способ добиться этого в Java - это определить интерфейс, который будет объявлять только один метод, тот, который вы хотите "передать в качестве аргумента ", и реализовать его в классе.Ваш класс должен реализовать интересующий вас метод. Когда вы хотите передать «ссылку» на метод, вы фактически передаете экземпляр вашего интерфейса.Вы можете вызвать для него свой метод.

Пример может объяснить это:

interface Something {
    void doSomething();
}

class HelloWorld {
    void doSomething() {
        System.out.println("Hello world");
    }
}

class Main {

    void runFunc(Something s) {
        s.doSomething();
    }

    public static void main(String... args) {
        runFunc(new HelloWorld());
    }

}

Проблема в том, что если вы хотите вызвать другой метод, вам нужно создать новый класс, реализующий Something

0 голосов
/ 09 августа 2011

Вы можете написать обработчик аннотаций, который с помощью частных API в JDK проверяет методы, вызываемые через API отражения, и время от времени останавливает процесс компиляции.Это подробно описано в API-интерфейсе с проверкой времени компиляции , как это делает dp4j.Если вы используете dp4j с @Reflect или аннотациями @Test JUnit , вы получите проверку во время компиляции при вызове метода «обычно», как в myDeclaredMethod(new Arg1Class())

0 голосов
/ 05 августа 2011

Это невозможно в Java: методы не являются гражданами первого класса в Java.

Но это можно сделать в Scala!

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