Ich habe Java gemacht, um (a == 1 && a == 2 && a == 3) immer wahr zu machen

Die ursprüngliche Geschichte ist dieser Artikel über StackOverflow JavaScript. https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true

Wie ein Samen offenbart, ** Wenn Sie die implizite Typkonvertierung in JavaScript überschreiben und die Verarbeitung dort ablegen, können Sie sie zum Zeitpunkt des Vergleichs ausführen! ** ** ** Deshalb können Sie mit Java arbeiten, wenn Sie es mit der geerbten Klasse überschreiben!

Implizite Java-Typkonvertierung

Lassen Sie uns für alle Fälle die implizite Typkonvertierung von Java überprüfen.

    @Test
    public void test_integer() {
        Integer a = Integer.valueOf(1);

        if(a == 1){
            System.out.println("true");
        }
    }

Dies wird verglichen, indem beim Vergleich mit int "intValue ()" von "Integer" aufgerufen wird. In Java heißt es Unboxing.

Erben Sie Integer und überschreiben Sie intValue

Fehlgeschlagen, da die Integer-Klasse endgültig ist und nicht überschrieben werden kann Oder besser gesagt, wenn Sie den intValue von Integer überschreiben, sterben Sie auf verschiedene Weise.

Nummer erben und intValue überschreiben

Erstellen wir also eine numerische Klasse, indem wir die Number-Klasse erben, die die übergeordnete abstrakte Klasse von Integer ist.


public class StrangeObject extends Number implements Comparable<Integer>{

    private int value;

    public StrangeObject(int value){
        this.value = value;
    }

    @Override
    public int intValue() {
        value++;
        return value;
    }

    @Override
    public long longValue() {
        value++;
        return value;
    }

    @Override
    public float floatValue() {
        value++;
        return value;
    }

    @Override
    public double doubleValue() {
        value++;
        return value;
    }

    public int compareTo(Integer outerValue) {

        return (value < outerValue) ? -1 : ((value == outerValue) ? 0 : 1);
    }
}

Da habe ich intValue () implementiert und auch die Schnittstelle von Comparable implementiert Es scheint vergleichbar zu sein mit int!

    @Test
    public void test_a1a2a3() throws Exception {

        StrangeObject a = new StrangeObject(0);

        if(a == 1 && a == 2 && a == 3){
            System.out.println("true");
        }
    }
Error:(22, 14) java:Die Typen StrangeObject und int können nicht verglichen werden

Es ist sinnlos, den Typ vor dem Vergleich zu überprüfen ...

    @Test
    public void test_a1a2a3() throws Exception {

        StrangeObject a = new StrangeObject(0);

        if(a.intValue() == 1 && a.intValue() == 2 && a.intValue() == 3){
            System.out.println("true");
        }
    }

Dies funktioniert, aber was soll ich tun, um intValue () zu entfernen (implizit auszuführen)?

Ganzzahl neu schreiben

Von hier an wird die Dunkelheit ziemlich tief sein, also lasst es uns einfach überprüfen.

Da im Kommentar darauf hingewiesen wurde, dass es nicht entpackt wird, es sei denn, es ist in einigen Systemklassen Schreiben Sie die Systemklasse neu.

Verwenden Sie Javassist, um die Integer-Klassendatei neu zu schreiben.

Im Fall einer Systemklasse kann sie zur Laufzeit nicht neu geschrieben werden Es spuckt einmal als statische Datei aus und liest die neu geschriebene Datei zur Laufzeit.

    @Test
    public void testIntegerExport() throws Exception {

        ClassPool pool = ClassPool.getDefault();
        CtClass cc = pool.get("java.lang.Integer");
        CtMethod method = cc.getDeclaredMethod("intValue");

        //Wert in intValue++Hinzugefügt
        method.insertBefore("value++;");

        //Geben Sie die geänderte Klassendatei aus
        cc.writeFile();

    }

Wenn Sie diese Testmethode ausführen, wird die neu geschriebene Integer-Klasse an . / Java / lang / Integer.class ausgegeben.

Erstellen Sie dann die folgende Hauptklasse.

public class A123 {
    public static void main(String[] args){
        
        Integer a = Integer.valueOf(0);

        if(a == 1 && a == 2 && a == 3){
            System.out.println(true);       
        }
    }
}

Für Laufzeitargumente Fügen Sie -Xbootclasspath / p :. hinzu.

Dadurch wird die geänderte Integer-Klasse geladen.

Wenn Sie diese Klasse jedoch laden

java.lang.InternalError 
 - klass: 'java/lang/InternalError'
#
# A fatal error has been detected by the Java Runtime Environment:
#
...

Es kann wahrscheinlich nicht ausgeführt werden, da der Wert von Integer schwankt, wenn die JVM ausgeführt wird.

Also werde ich die Integer-Datei weiter modifizieren.

Integer neu schreiben (überarbeitet)

Machen Sie es zu einer Integer-Klasse, die vom Beginn der VM-Ausführung bis zur Ausführung der Hauptklasse normal funktioniert.

    @Test
    public void testIntegerExport2() throws Exception {

        ClassPool pool = ClassPool.getDefault();
        CtClass cc = pool.get("java.lang.Integer");
        CtMethod m = cc.getDeclaredMethod("intValue");

        //Habe eine Flagge drinnen
        CtField isBroken = new CtField(CtClass.booleanType, "isBroken", cc);
        isBroken.setModifiers(Modifier.PUBLIC);
        cc.addField(isBroken, CtField.Initializer.constant(false));

        //Nur hinzufügen, wenn das Flag aktiviert ist
        m.insertBefore("if(isBroken) value++;");

        //Geben Sie die geänderte Klassendatei aus
        cc.writeFile();

    }

Hinzufügen der Flag-Änderungsverarbeitung zur Hauptklasse.

public class A123 {
    public static void main(String[] args) {

        Integer a = Integer.valueOf(0);

        try {
            //Schreiben Sie isBroken mit Reflection neu, um Kompilierungsfehler zu vermeiden
            Integer.class.getField("isBroken").setBoolean(a, true);

            if (a == 1 && a == 2 && a == 3) {
                System.out.println(true);
            }

        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }

    }
}

Wenn Sie versuchen, den Wert für isBroken of Integer zu ändern Wenn Sie es normal umschreiben, ist das Feld nicht vorhanden Ich erhalte einen Kompilierungsfehler. Daher tritt beim Umschreiben mit Reflektion ein Laufzeitfehler auf, wenn er nicht vorhanden ist. Sie können den Schrecken der Reflexion sehen ...

Ausführungsergebnis Wenn Sie dem Laufzeitargument -Xbootclasspath / p :. hinzufügen und ausführen,

true

Ich konnte (a == 1 && a == 2 && a == 3) in Java erfolgreich in true ändern.

Zusammenfassung

Recommended Posts

Ich habe Java gemacht, um (a == 1 && a == 2 && a == 3) immer wahr zu machen
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
So erstellen Sie einen Java-Container
So erstellen Sie ein Java-Array
Ich möchte eine Liste mit Kotlin und Java erstellen!
Ich wollte nur eine reaktive Eigenschaft in Java erstellen
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben
Ich habe einen RESAS-API-Client in Java erstellt
Wie erstelle ich einen Discord Bot (Java)
[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Java Ich habe versucht, einen einfachen Block zu brechen
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (PowerMockito Edition)
Was ich getan habe, als ich Java zu Kotlin konvertiert habe
Ich habe versucht, mit AI "A3RT" eine Talk-App in Java zu erstellen.
Ich habe versucht, den Block mit Java zu brechen (1)
Sogar in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (Javassist zweite Abkochung)
[Kleine Geschichte] Ich habe versucht, die Java-ArrayList etwas komfortabler zu gestalten
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 (Black Magic) ausgeben.
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich habe nc (netcat) normalerweise mit JAVA gemacht
[Java] Mach es konstant
Machen Sie einen Diamanten mit Java
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.
[Java] Ich möchte ein Byte-Array in eine Hexadezimalzahl konvertieren
[Anfänger] Versuchen Sie, mit Java ein einfaches RPG-Spiel zu erstellen ①
[Anfänger] Ich habe ein Programm zum Verkauf von Kuchen in Java erstellt
Ich möchte ein bestimmtes Modell von ActiveRecord ReadOnly erstellen
Ich habe versucht, Java Optional und Guard-Klausel koexistieren zu lassen
Ich habe versucht, in Java von einer Zeichenfolge in einen LocalDate-Typ zu konvertieren
Ich habe eine Docker-Datei erstellt, um Glassfish 5 mit Oracle Java zu starten
[Java] Ich habe versucht, ein Janken-Spiel zu erstellen, das Anfänger auf der Konsole ausführen können
Versuchen Sie, einen einfachen Rückruf zu tätigen
Ich habe ein PDF mit Java erstellt.
Ich habe eine shopify App @java erstellt
So erstellen Sie einen JDBC-Treiber
Ich habe versucht, mit Java zu interagieren
So erstellen Sie einen Begrüßungsbildschirm
So erstellen Sie ein Jenkins-Plug-In
Wie erstelle ich ein Maven-Projekt?
Ich habe versucht, das Java-Lernen zusammenzufassen (1)
Ich habe jetzt versucht, Java 8 zusammenzufassen
Versuchen Sie, einen Iterator zu erstellen, der einen Blick darauf werfen kann
[Unity] Ich habe mit NWPathMonitor ein natives Plug-In UniNWPathMonitor erstellt
Erstellt eine Methode zum Anfordern von Premium Friday (Java 8-Version)
Ich habe versucht, eine Android-Anwendung mit MVC zu erstellen (Java)
Wie man einen revolutionären Diamanten mit Java für Aussage macht wwww
Ich habe versucht, mit Rails eine Gruppenfunktion (Bulletin Board) zu erstellen
Ich habe versucht, eine einfache Gesichtserkennungs-Android-Anwendung mit OpenCV zu erstellen
Ich möchte ein schönes build.gradle schreiben
Ich möchte eine ios.android App machen
Ich habe versucht, Java-Lambda-Ausdrücke zusammenzufassen
Ich war süchtig nach einem einfachen Test von Jedis (Java-> Redis-Bibliothek)
[Java / kotlin] Kai ・ Wie erstelle ich einen Discord Bot? Lassen Sie uns einen Befehl implementieren, um zu grüßen.
[iOS] Ich habe versucht, mit Swift eine insta-ähnliche Verarbeitungsanwendung zu erstellen
[JAVA] Projekt Euler, ich steckte im achten Quartal fest