Вызов динамического метода без известного конструктора? - PullRequest
0 голосов
/ 28 мая 2011

Если я делаю это в Java для динамического вызова имени метода из класса, это работает.

MainApp app = new MainApp();
Method meth = app.getClass().getMethod("myMethod", MyParameterType.class);
//call method
meth.invoke(app, new MyParameterType("hello"));

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

//This is in the class call MainApp.java. 
//There is a method in MainApp.java that looks this way: myMethod(MyParameterType param);
MainApp app = new MainApp();
OtherClass myClass = new OtherClass();
Method meth = app.getClass().getMethod("myMethod", MyParameterType.class);
myClass.callMe(meth);

//Inside OtherClass.java
public void callMe(Method meth) {
    //call method
    meth.invoke(########, new MyParameterType("hello"));
}

В этом случае, что я должен поставить для параметра ########? В контексте OtherClass.java объект базового конструктора не будет известен. И зачем мне это нужно, так как meth уже тип Метода, который я просто вызываю как функцию?

Спасибо

Ответы [ 3 ]

1 голос
/ 28 мая 2011

Похоже, вы ищете или думаете о концепции «лямбда-функций».Их можно вызывать изолированно.

Тип метода - это не автономный метод, а скорее «путь» в объект.Сравните это с относительным URL, например /subscribe.html.Вне контекста это довольно бесполезно, но в сочетании с таким сайтом, как www.example.com, это имеет смысл.

Таким образом, метод может использоваться только в сочетании с экземпляром. (редактировать: как упоминал Джон, если, конечно, это не статический метод, который не нуждается в экземплярах)

1 голос
/ 28 мая 2011

Предполагая, что это метод экземпляра, вы должны иметь экземпляр для вызова метода, как и все остальное.Как вы заполучите этот экземпляр, будет зависеть от того, что вы пытаетесь сделать;Вы могли бы передать Constructor, или ссылку на существующий объект, или какой-либо интерфейс, который создаст экземпляр, когда вы попросите его ... мы не можем дать вам какой-либо совет, какой подход является наиболее подходящим беззная, что вы пытаетесь сделать.

Если это статический метод, вы можете передать null для первого аргумента.

0 голосов
/ 28 мая 2011

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

Если вам нужно предоставить экземпляр объекта, то нет никакого способа обойти это.

Если разработчик, который пишет метод, пометил его как нестатический неправильно, я предлагаю вам обсудить сим, почему они это сделали.

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