Mam do czynienia z sytuacją wymagającą klasy i metod.

Aby to uprościć, wyobraź sobie, że masz 2 klasy: A i B.

W klasie A mam metodę o nazwie, powiedzmy, "jumpOnOtherClass". W klasie B mam inną metodę o nazwie „doThings”.

Chciałbym, aby metoda klasy A przyjęła jako argument dowolny obiekt dowolnej klasy, tak aby najpierw sprawdzała, czy obiekt ma wartość null (aby mogła utworzyć nowe wystąpienie przekazanego obiektu), a następnie wykonuje metodę obiektu klasa.

Oto przykładowy kod:

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
  }
}

Wiem, że są wyjątki, które należy wziąć pod uwagę, ale dla przykładu przyjmiemy, że klasa i metody istnieją i zostały znalezione :)

Próbowałem różnych rzeczy z „java.lang.reflect”, ale wydaje się, że nie jest to dobry sposób na osiągnięcie tego, co próbuję ...

Każda pomoc byłaby naprawdę miła!

Dziękuję i miłego dnia!

1
Larry Ko 2 kwiecień 2020, 12:38

3 odpowiedzi

Najlepsza odpowiedź

Jedynym problemem jest to, że jeśli referencja ma wartość null, nie możesz tak naprawdę znać klasy „obiektu” w czasie wykonywania, więc będziesz musiał to naprawić, podając dodatkowe informacje.

Proponuję takie podejście (wymaga refleksji):

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);
    }

I użyj go w ten sposób:

jumpOnOtherClass(this.objectB, B.class, "doThings");
0
Halex 2 kwiecień 2020, 09:54

Nie jestem do końca pewien, czy rozumiem pytanie, ale wygląda na to, że szukasz sposobu na rozróżnienie klas początkowo przekazanych jako obiekty? Możesz użyć słowa kluczowego instanceof, a następnie zaryzykować kilka wyjątków rzutowania

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
  }
}
0
Noah Cagle 2 kwiecień 2020, 09:50

Ok! W końcu to działa! Oto ostateczny kod:

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");
  }
}

Problem w rzeczywistości pochodzi z zagnieżdżenia klas wykonanego przez przetwarzanie (i ogólnie z zagnieżdżenia klas). Usunąłem „getConstructor ()” z wiersza, w którym sprawdzano, czy obiekt b ma wartość null.

Może ktoś mógłby wyjaśnić w tym poście, dlaczego usunięcie tej metody sprawiło, że wszystko działało ... Spróbuję zrozumieć i jeśli coś na ten temat będę miał, zostanie to opublikowane tutaj!

Jeszcze raz wielkie dzięki za pomoc: D

Miłego dnia!

Larry.K

0
Larry Ko 2 kwiecień 2020, 13:14