Использование объекта в методе путем передачи его в качестве параметра - PullRequest
1 голос
/ 02 апреля 2020

Я сталкиваюсь с ситуацией, в которой используются класс и методы.

Для простоты представьте, что у вас есть 2 класса: A и B

В классе A у меня есть метод называется, скажем, "jumpOnOtherClass". В классе B у меня есть другой метод с именем doThings.

Я бы хотел, чтобы метод класса A принимал в качестве аргумента любой объект любого класса, чтобы он сначала проверял, является ли объект нулевым (так он может создать новый экземпляр переданного объекта), а затем выполнить метод класса объекта.

Вот пример кода:

class MyMainClass
{
  private A objectA = new A();
  private B objectB;

  public void main()
  {
    this.objectA.jumpOnOtherClass(this.objectB,"doThings");
  }
}

class A
{
  public void jumpOnOtherClass(Object objectFromAnyClass, String methodToInvoke)
  {
    if(objectFromAnyClass == null) objectFromAnyClass = new DefaultConstructorOfB();

    objectFromAnyClass.getMethod(methodToInvoke);
  }
}

class B
{
  public void doThings()
  {
    //Do some stuff here
  }
}

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

Любая помощь была бы очень хороша!

Спасибо и хорошего дня!

Ответы [ 3 ]

0 голосов
/ 02 апреля 2020

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

Я предлагаю этот подход (он предполагает отражение):

public <T> void jumpOnOtherClass(T objectFromAnyClass, Class<T> classType, String methodToInvoke)
            throws
            NoSuchMethodException,
            IllegalAccessException,
            InvocationTargetException,
            InstantiationException
    {
        if(objectFromAnyClass == null) 
            objectFromAnyClass = classType.getDeclaredConstructor().newInstance();

        classType.getMethod(methodToInvoke).invoke(objectFromAnyClass);
    }

и используйте его так:

jumpOnOtherClass(this.objectB, B.class, "doThings");
0 голосов
/ 02 апреля 2020

Хорошо! Я понял, это работает, наконец! Итак, вот окончательный код:

class A
{
  public <T> void jumpOnOtherClass(T objectFromAnyClass, Class<T> classType, String methodToInvoke) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException
  {
    if(objectFromAnyClass == null)
    {
      println("instantiating");
      objectFromAnyClass = classType.newInstance();
    }

    println("getting the method");
    classType.getMethod(methodToInvoke).invoke(objectFromAnyClass);

    println("It works :D");
  }
}

static class B
{  
  public void doThings()
  {
    println("message from class B");
  }
}

Проблема на самом деле исходила от вложенности классов, сделанной обработкой (и вообще любой вложенности классов). Я удалил getConstructor () из строки, где он проверял, был ли объект b нулевым.

Может быть, кто-то может объяснить в этом посте, почему удаление этого метода сделало все работающим ... Я попытаюсь понять, и если у меня что-то есть об этом, оно будет опубликовано здесь!

Еще раз, большое спасибо вам, ребята, за помощь: D

Хорошего дня!

Larry.K

0 голосов
/ 02 апреля 2020

Я не совсем уверен, что понимаю вопрос, но, похоже, вы ищете способ различать классы, изначально переданные как Objects? Вы можете использовать ключевое слово instanceof, а затем рискнуть некоторыми исключениями приведения

class MyMainClass
{
private A objectA = new A();
private B objectB;

public void main()
{
   this.objectA.jumpOnOtherClass(this.objectB,"doThings");
}
}

class A
{
  public void jumpOnOtherClass(Object objectFromAnyClass, String methodToInvoke)
  {
    if(objectFromAnyClass == null) objectFromAnyClass = new DefaultConstructorOfB();
    else if (objectFromAnyClass instanceof B) {
         if (methodToInvoke.equals("doThings")) 
            ((B) objectFromAnyClass).doThings();
    }
  }
}

class B
{
  public void doThings()
  {
    //Do some stuff here
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...