Même en Java, je veux sortir vrai avec un == 1 && a == 2 && a == 3 (magie grise qui n'est pas tant que magie noire)

J'ai été inspiré par l'article ci-dessous.

Je veux afficher true même en Java avec a == 1 && a == 2 && a == 3 --Qiita Je veux afficher true en Java avec a == 1 && a == 2 && a == 3 (édition PowerMockito) --Qiita Je veux afficher true même en Java avec a == 1 && a == 2 && a == 3 (Black Magic) --Qiita Je veux afficher true même en Java avec a == 1 && a == 2 && a == 3 (édition noire) --Qiita

Puisqu'il a été réalisé par Proxy de la bibliothèque standard Java, il est nécessaire d'implémenter l'interface.

Point d'accès


public static void main(String... args) throws Exception {
	{
		System.out.println("Tout d'abord, si vous l'exécutez normalement ...");
		Judge judge = new JudgeImpl();
		test(judge);
	}
	{
		System.out.println("Si vous mordez le proxy ...");
		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) );
}

Logique du jugement


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

L'interface cible pour réécrire le résultat du traitement


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

Classe proxy qui réécrit le résultat du traitement


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

/**Dans l'interface spécifiée par la méthode addInterface
La valeur de retour est(B|b)S'il existe une méthode booléenne, le résultat sera vrai*/
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("Vraiment`"+normalValue+"`J'ai entendu que tu voulais revenir`true`Je reviendrai!");
				return true;
			}
			return normalValue;
		}
	}
}

Résultat d'exécution

Tout d'abord, si vous l'exécutez normalement ...
false
false
false
Si vous mordez le proxy ...
Vraiment`false`J'ai entendu que tu voulais revenir`true`Je reviendrai!
true
Vraiment`false`J'ai entendu que tu voulais revenir`true`Je reviendrai!
true
Vraiment`false`J'ai entendu que tu voulais revenir`true`Je reviendrai!
true

Recommended Posts

Même en Java, je veux sortir vrai avec un == 1 && a == 2 && a == 3 (magie grise qui n'est pas tant que magie noire)
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (Black Magic)
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
Même en Java, je veux sortir true avec un == 1 && a == 2 && a == 3 (Royal road edition qui n'est ni magique ni rien)
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (édition PowerMockito)
Même en Java, je veux sortir true avec un == 1 && a == 2 && a == 3 (deuxième décoction Javassist)
Je veux ForEach un tableau avec une expression Lambda en Java
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
Sortie true avec if (a == 1 && a == 2 && a == 3) en Java (identifiant invisible)
Même si je souhaite convertir le contenu d'un objet de données en JSON en Java, il existe une référence circulaire ...
Je veux faire une liste avec kotlin et java!
Je veux créer une fonction avec kotlin et java!
Je veux créer un fichier Parquet même en Ruby
[Java] Je souhaite tester l'entrée standard et la sortie standard avec JUnit
Je veux écrire une boucle qui fait référence à un index avec l'API Stream de Java 8
Je veux FlashAttribute au printemps même si j'ai défini un proxy inverse! (ne pas faire)
Une collection de modèles dont vous voulez être conscient pour ne pas compliquer le code
Une histoire que j'ai eu du mal à défier le pro de la concurrence avec Java
[Java] Je veux effectuer distinctement avec la clé dans l'objet
[Java] JUnit qui NG lorsqu'une méthode avec un grand nombre de lignes est détectée en utilisant la magie noire
Je souhaite sélectionner plusieurs éléments avec une disposition personnalisée dans la boîte de dialogue
Je souhaite créer un SNS Web sombre avec Jakarta EE 8 avec Java 11
Je souhaite afficher un PDF chinois (coréen) avec des rapports fins
Une histoire qui a souffert d'un espace qui ne disparaît pas même s'il est taillé avec Java La cause est BOM
J'ai créé un programme qui recherche la classe cible à partir du processus surchargé avec Java
Faisons une application TODO avec Java 2 Je veux créer un modèle avec Spring Initializr et créer Hello world
Je souhaite envoyer un e-mail en Java.
Je l'ai fait en Java pour toujours rendre (a == 1 && a == 2 && a == 3) vrai
Je veux utiliser java8 forEach avec index
rsync4j --Je veux toucher rsync en Java.
J'ai essayé de sortir quatre-vingt-dix-neuf en Java
Je veux être finalement même à kotlin
[Java] Quelque chose est affiché comme "-0.0" dans la sortie
J'ai essayé de casser le bloc avec java (1)
Turbolinks: je veux résoudre le problème que JS ne s'affiche pas correctement à moins d'être rechargé lors de la transition avec link_to
Je veux trouver la somme de contrôle MD5 d'un fichier en Java et obtenir le résultat sous forme de chaîne de caractères en notation hexadécimale.
J'ai utilisé Docker pour mon portfolio en tant que débutant, donc j'espère que même 1 mm sera utile à quelqu'un.
MockMVC renvoie 200 même si je fais une demande vers un chemin qui n'existe pas
Je souhaite utiliser PowerMock dans une classe qui combine des tests paramétrés et des tests ordinaires
7 choses que je veux que tu gardes pour que ça ne devienne pas un putain de code
Je souhaite renvoyer un objet au format CSV avec en-tête et filtre multilignes en Java
Si hash [: a] [: b] [: c] = 0 dans Ruby, je veux que vous étendiez récursivement même si la clé n'existe pas
[Java] Traitement de la situation où le programme qui écrit dans le flux de sortie du processus ne se termine pas même si waitFor
Je souhaite également utiliser Combine dans UIKit.
Je veux faire quelque chose comme "cls" en Java
Je veux aussi utiliser ES2015 avec Java! → (´ ・ ω ・ `)
Je veux utiliser une petite icône dans Rails
J'ai essayé de créer une compétence Clova en Java
Je souhaite surveiller un fichier spécifique avec WatchService
J'ai essayé de créer une fonction de connexion avec Java
Résolution du problème lorsque Azure Functions a cessé de fonctionner en Java
Je souhaite définir une fonction dans la console Rails
Je veux faire des transitions d'écran avec kotlin et java!
Je veux cliquer sur une broche GoogleMap dans RSpec
Java11: exécuter le code Java dans un seul fichier tel quel
Comment initialiser par lots des tableaux avec Java que je ne savais pas quand j'étais débutant
[Moteur CQ] Je souhaite gérer des collections comme Stream ou .Net LINQ même dans Java 7.
Je veux renvoyer un type différent de l'élément d'entrée avec Java8 StreamAPI Reduce ()
Une histoire que j'ai réalisé que je devais étudier en premier lieu en tant qu'ingénieur