Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (graue Magie, die weniger schwarze Magie ist)

Der folgende Artikel hat mich inspiriert.

Ich möchte true auch in Java mit == 1 && a == 2 && a == 3 --Qiita ausgeben Ich möchte true in Java mit == 1 && a == 2 && a == 3 (PowerMockito Edition) --Qiita ausgeben Ich möchte true auch in Java mit a == 1 && a == 2 && a == 3 (Black Magic) --Qiita ausgeben Ich möchte true auch in Java mit a == 1 && a == 2 && a == 3 (schwarze Ausgabe) ausgeben - Qiita

Da es von Proxy der Java-Standardbibliothek realisiert wurde, ist es erforderlich, die Schnittstelle zu implementieren.

Einstiegspunkt


public static void main(String... args) throws Exception {
	{
		System.out.println("Zuallererst, wenn Sie es normal ausführen ...");
		Judge judge = new JudgeImpl();
		test(judge);
	}
	{
		System.out.println("Wenn Sie den Proxy beißen ...");
		Judge judge = new AlwaysTrue.Builder()
				.addInterface(Judge.class)
				.build(JudgeImpl.class);
		test(judge);
	}
}

private static void test(Judge judge){
	System.out.println( judge.judge(1) );
	System.out.println( judge.judge(2) );
	System.out.println( judge.judge(3) );
}

Beurteilungslogik


public class JudgeImpl implements Judge{
    public boolean judge(int a) {
        if (a == 1 && a == 2 && a == 3) {
            return true;
        } else {
            return false;
        }
    }
}

Die Zielschnittstelle zum Umschreiben des Verarbeitungsergebnisses


public interface Judge {
    public boolean judge(int a);
}

Proxy-Klasse, die das Verarbeitungsergebnis neu schreibt


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;

/**In der durch die addInterface-Methode angegebenen Schnittstelle
Der Rückgabewert ist(B|b)Wenn es eine boolesche Methode gibt, ist das Ergebnis wahr*/
public class AlwaysTrue{

	public static class Builder{
		List<Class<?>> interfaces = new ArrayList<>();
		public Builder addInterface(Class<?> interfaze) {
			interfaces.add(interfaze);
			return this;
		}
		private Class<?>[] getInterfacesArray(){
			Class<?>[] clazzArr = new Class[interfaces.size()];
			for( int i =0;i<interfaces.size();i++) {
				clazzArr[i] = interfaces.get(i);
			}
			return clazzArr;
		}

		public <E> E build(Class<?> clazz) throws Exception {
			Object normalInstance = clazz.newInstance();
			Object prankInstance = Proxy.newProxyInstance(
					clazz.getClassLoader(),
					getInterfacesArray(),
					new AlwaysTrueHandler(normalInstance));
			@SuppressWarnings("unchecked")
			E o = (E)prankInstance;
			return o;
		}
	}

	private static class AlwaysTrueHandler implements InvocationHandler {
		private Object normalInstance;
		public AlwaysTrueHandler( Object normalInstance){
			this.normalInstance = normalInstance;
		}
		@Override
		public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
			Object normalValue =  method.invoke(normalInstance, args);
			if( method.getReturnType() == Boolean.class
					|| method.getReturnType() == boolean.class ){
				System.out.println("Ja wirklich`"+normalValue+"`Ich habe gehört, du willst zurückkehren`true`Ich werde zurückkommen!");
				return true;
			}
			return normalValue;
		}
	}
}

Ausführungsergebnis

Zuallererst, wenn Sie es normal ausführen ...
false
false
false
Wenn Sie den Proxy beißen ...
Ja wirklich`false`Ich habe gehört, du willst zurückkehren`true`Ich werde zurückkommen!
true
Ja wirklich`false`Ich habe gehört, du willst zurückkehren`true`Ich werde zurückkommen!
true
Ja wirklich`false`Ich habe gehört, du willst zurückkehren`true`Ich werde zurückkommen!
true

Recommended Posts

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 (Black Magic) ausgeben.
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 (Royal Road Edition, die weder Magie noch irgendetwas ist)
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (PowerMockito Edition)
Sogar in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (Javassist zweite Abkochung)
Ich möchte für jedes Array mit Lambda-Ausdruck in Java
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Ausgabe true mit if (a == 1 && a == 2 && a == 3) in Java (Invisible Identifier)
Auch wenn ich den Inhalt eines Datenobjekts in Java in JSON konvertieren möchte, gibt es einen Zirkelverweis ...
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
Ich möchte eine Schleife schreiben, die auf einen Index mit der Stream-API von Java 8 verweist
Ich möchte das Flash-Attribut im Frühjahr, auch wenn ich einen Reverse-Proxy festgelegt habe! (TU es nicht)
Eine Sammlung von Mustern, die Sie kennen möchten, um den Code nicht zu komplizieren
Eine Geschichte, die ich mit Java nur schwer herausfordern konnte
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten
[Java] Vereinigen Sie diese NG, wenn eine Methode mit einer großen Anzahl von Zeilen mithilfe von schwarzer Magie erkannt wird
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
Eine Geschichte, die unter einem Raum litt, der nicht verschwindet, selbst wenn er mit Java beschnitten ist
Ich habe ein Programm erstellt, das aus dem mit Java überladenen Prozess nach der Zielklasse sucht
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 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
[Java] In der Ausgabe wird etwas als "-0.0" angezeigt
Ich habe versucht, den Block mit Java zu brechen (1)
Turbolinks: Ich möchte das Problem lösen, dass JS nicht richtig angezeigt wird, es sei denn, es wird beim Übergang mit link_to neu geladen
Ich möchte die MD5-Prüfsumme einer Datei in Java finden und das Ergebnis als Zeichenfolge in hexadezimaler Notation erhalten.
Ich habe Docker als Anfänger für mein Portfolio verwendet, daher hoffe ich, dass sogar 1 mm für jemanden hilfreich ist.
MockMVC gibt 200 zurück, auch wenn ich eine Anfrage an einen Pfad stelle, der nicht existiert
Ich möchte PowerMock in einer Klasse verwenden, die parametrisierte Tests und gewöhnliche Tests kombiniert
7 Dinge, die du behalten sollst, damit es kein verdammter Code wird
Ich möchte ein Objekt im CSV-Format mit mehrzeiligem Header und Filter in Java zurückgeben
Wenn in Ruby Hash [: a] [: b] [: c] = 0 ist, möchten wir, dass Sie rekursiv erweitern, auch wenn der Schlüssel nicht vorhanden ist
[Java] Umgang mit der Situation, in der das Programm, das in den Output Stream of Process schreibt, nicht endet, selbst wenn waitFor
Ich möchte Combine auch in UIKit verwenden.
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
Adressiert, da Azure-Funktionen in Java nicht mehr funktionieren
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
Java11: Führen Sie Java-Code unverändert in einer einzelnen Datei aus
Wie man Arrays mit Java stapelweise initialisiert, wusste ich als Anfänger nicht
[CQ Engine] Ich möchte Sammlungen wie Stream oder .Net LINQ auch in Java 7 verarbeiten.
Ich möchte mit Java8 StreamAPI redu () einen anderen Typ als das Eingabeelement zurückgeben.
Eine Geschichte, die mir klar wurde, dass ich überhaupt als Ingenieur studieren musste