Sogar in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (Javassist zweite Abkochung)

Vorwort

Dies ist eine Version, die den Wert der Variablen a mit Javassist von "Ich möchte true mit a == 1 && a == 2 && a == 3 auch in Java ausgeben" neu schreibt.

Quelle

EqualsA.java


package com.example;

public class EqualsA {

	private int a;

	public void execute() {
		System.out.println("start");

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

		System.out.println("end");
	}
}

EqualsMain.java


package com.example;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.expr.ExprEditor;
import javassist.expr.FieldAccess;

public class EqualsMain {

	public static void main(String[] args) throws Exception {
		convert();

		new EqualsA().execute();
	}

	static void convert() throws Exception {
		ClassPool classPool = ClassPool.getDefault();
		CtClass cc = classPool.get("com.example.EqualsA");
		cc.instrument(new ExprEditor() {

			private int i = 1;

			@Override
			public void edit(FieldAccess f) throws CannotCompileException {
				if (f.getFieldName().equals("a")) {
					f.replace(String.format("$_ = %d;", i++));
				}
			}
		});

		cc.toClass();
	}
}

ExprEditor scheint nicht in der Lage zu sein, lokale Variablen zu verarbeiten, aber es kann Felder verarbeiten.

Bonus (Scala)

object EqualsA {
  def main(args: Array[String]): Unit = {
    val a = Int(1)
    if (a == 1 && a == 2 && a == 3) {
      println("true")
    } else {
      println("false")
    }
  }

  case class Int(n: scala.Int) {
    override def equals(other: Any) = true
  }
}

Recommended Posts

Sogar in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (Javassist zweite Abkochung)
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (PowerMockito Edition)
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 (Black Magic) ausgeben.
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (graue Magie, die weniger schwarze Magie ist)
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (Royal Road Edition, die weder Magie noch irgendetwas ist)
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Ich möchte für jedes Array mit Lambda-Ausdruck in Java
Ausgabe true mit if (a == 1 && a == 2 && a == 3) in Java (Invisible Identifier)
Ich möchte eine Liste mit Kotlin und Java erstellen!
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Ich möchte eine Parkettdatei auch in Ruby erstellen
[Java] Ich möchte Standardeingabe und Standardausgabe mit JUnit testen
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten
Ich möchte im Dialogfeld mehrere Elemente mit einem benutzerdefinierten Layout auswählen
Ich möchte mit Jakarta EE 8 mit Java 11 ein dunkles Web-SNS erstellen
Ich möchte ein chinesisches (koreanisches) PDF mit dünnen Berichten anzeigen
Ich möchte eine E-Mail in Java senden.
Ich habe Java gemacht, um (a == 1 && a == 2 && a == 3) immer wahr zu machen
Ich möchte Java8 für jeden mit Index verwenden
rsync4j - Ich möchte rsync in Java berühren.
Ich habe versucht, neunundneunzig in Java auszugeben
Ich möchte irgendwann sogar in Kotlin sein
Ich habe versucht, den Block mit Java zu brechen (1)
Ich möchte so etwas wie "cls" in Java machen
Ich möchte ES2015 auch in Java verwenden! → (´ ・ ω ・ `)
Ich möchte ein kleines Symbol in Rails verwenden
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich möchte eine bestimmte Datei mit WatchService überwachen
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich möchte eine Funktion in der Rails Console definieren
Ich möchte Bildschirmübergänge mit Kotlin und Java machen!
Ich möchte in RSpec auf einen GoogleMap-Pin klicken
Lassen Sie uns eine TODO-Anwendung mit Java 2 erstellen. Ich möchte eine Vorlage mit Spring Initializr erstellen und eine Hello-Welt erstellen
Ich möchte ein Objekt im CSV-Format mit mehrzeiligem Header und Filter in Java zurückgeben
Auch wenn ich den Inhalt eines Datenobjekts in Java in JSON konvertieren möchte, gibt es einen Zirkelverweis ...
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.
[Anfänger] Ich habe ein Programm zum Verkauf von Kuchen in Java erstellt
Ich wollte nur eine reaktive Eigenschaft in Java erstellen
Ich habe versucht, in Java von einer Zeichenfolge in einen LocalDate-Typ zu konvertieren
Ich habe einen RESAS-API-Client in Java erstellt
Ich möchte verschiedene Funktionen mit Kotlin und Java implementieren!
Ich möchte die if-else-Anweisung für bedingte Verzweigungen in Java vereinfachen
Ich möchte eine Schleife schreiben, die auf einen Index mit der Stream-API von Java 8 verweist
[CQ Engine] Ich möchte Sammlungen wie Stream oder .Net LINQ auch in Java 7 verarbeiten.
Ich möchte das Flash-Attribut im Frühjahr, auch wenn ich einen Reverse-Proxy festgelegt habe! (TU es nicht)
Ich möchte mit Java8 StreamAPI redu () einen anderen Typ als das Eingabeelement zurückgeben.
Ich habe ein PDF mit Java erstellt.
Ich habe versucht, mit Java zu interagieren
Protokollausgabe in Datei in Java
Eine Geschichte, die ich mit Java nur schwer herausfordern konnte
Ich möchte mit link_to [Hinweis] eine Schaltfläche mit einem Zeilenumbruch erstellen.
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!
Ich möchte mit einem regulären Ausdruck zwischen Zeichenketten extrahieren
[Wire Mock] Ich möchte einen Stub / Mock-Server in Java einrichten und E2E-Tests durchführen.
[Ruby] Ich möchte nur das ungerade Zeichen in der Zeichenfolge ausgeben
Ich möchte eine Webanwendung entwickeln!
Ich möchte ein schönes build.gradle schreiben