Reflection: Ein Objekt in eine Unterklasse umwandeln, ohne instanceof @ zu verwende

Ich habe diese einfache Schnittstelle / Klasse:

public abstract class Message {}

public class Message1 extends Message {}

public class Message2 extends Message {}

Und eine Utility-Klasse:

public class Utility {
    public void handler(Message m) {
        System.out.println("Interface: Message");
    }

    public void handler(Message1 m) {
        System.out.println("Class: Message1");
    }

    public void handler(Message2 m) {
        System.out.println("Class: Message2");
    }
}

Nun, die Hauptklasse:

public static void main(String[] args) {

    Utility p = new Utility();

    Message1 m1 = new Message1();
    p.handler(m1);

    Message m = (Message) m1;
    p.handler(m);

}

Die Ausgabe ist

> Class: Message1
> Interface: Message

Ich würde dasp.handler(m) die Methode aufrufenp.handler(m:Message1)

Ich möchte nicht den Befehl "manual" verwendeninstanceof weil ich viele Fälle habe:

if(m instance of Message1)
p.handler((Message1)m)
else if (m instanceof Message2)
p.handler((Message2)m)
...

Wenn ich rufem.getClass() Ich erhalte "mypackage.Message1", also die Unterklasse und nicht die Superklasse.

Ich versuche es mit diesem Code (benutze Reflection):

p.handler(m.getClass().cast(m));

Aber die Ausgabe ist

> Interface: Message

Also, das ist mein Problem. Ich würde ein Laufzeit-Cast von Superklasse-Objekt zu Unterklasse-Objekt machen, ohne den "Code-Befehl" istanceof zu verwenden.

Ich hätte einen richtigen Befehl wie diesen:

p.handler((m.getclass)m);

Wie kann ich es bekommen? Es ist möglich

Antworten auf die Frage(4)

Ihre Antwort auf die Frage