Je l'ai fait en Java pour toujours rendre (a == 1 && a == 2 && a == 3) vrai

L'histoire originale est cet article sur StackOverflow JavaScript. https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true

Comme le révèle une graine, ** Si vous remplacez la conversion de type implicite dans JavaScript et y mettez le traitement, vous pouvez l'exécuter au moment de la comparaison! ** ** C'est pourquoi vous pouvez utiliser Java si vous le remplacez par la classe héritée!

Conversion de type implicite Java

Au cas où, vérifions la conversion de type implicite de Java.

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

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

Ceci est comparé en appelant ʻintValue () de ʻInteger lors de la comparaison avec int. En Java, cela s'appelle unboxing.

Hériter un entier et remplacer intValue

Échec car la classe Integer est finale et ne peut pas être remplacée Ou plutôt, si vous remplacez la valeur intValue de Integer, vous mourrez de différentes manières.

Hériter de Number et remplacer intValue

Alors, créons une classe numérique en héritant de la classe Number, qui est la classe abstraite parente d'Integer.


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);
    }
}

Depuis que j'ai implémenté intValue () et également implémenté l'interface de Comparable Cela semble comparable à 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:Les types StrangeObject et int ne peuvent pas être comparés

Inutile de vérifier le type avant comparaison ...

    @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");
        }
    }

Cela fonctionne, mais que dois-je faire pour supprimer (exécuter implicitement) intValue ()?

Réécrire un entier

À partir de maintenant, l'obscurité sera assez profonde, alors vérifions-le.

Puisqu'il a été souligné dans le commentaire qu'il ne sera pas déballé à moins qu'il ne soit dans certaines classes système Réécrivez la classe système.

Utilisez Javassist pour réécrire le fichier de classe Integer.

Dans le cas d'une classe système, elle ne peut pas être réécrite à l'exécution, donc Il est craché une fois en tant que fichier statique et le fichier réécrit est lu au moment de l'exécution.

    @Test
    public void testIntegerExport() throws Exception {

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

        //value dans intValue++Ajoutée
        method.insertBefore("value++;");

        //Sortie du fichier de classe modifié
        cc.writeFile();

    }

L'exécution de cette méthode de test affichera la classe Integer réécrite dans . / Java / lang / Integer.class.

Créez ensuite la classe principale suivante.

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);       
        }
    }
}

Pour les arguments d'exécution Ajoutez -Xbootclasspath / p: ..

Cela chargera la classe Integer modifiée.

Cependant, si vous chargez cette classe

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

Il ne peut pas être exécuté probablement parce que la valeur de Integer fluctue lorsque la JVM est exécutée.

Je vais donc modifier davantage le fichier Integer.

Réécrire Integer (révisé)

Faites-en une classe Integer qui fonctionne normalement du début de l'exécution de la VM jusqu'à ce que la classe principale soit exécutée.

    @Test
    public void testIntegerExport2() throws Exception {

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

        //Avoir un drapeau à l'intérieur
        CtField isBroken = new CtField(CtClass.booleanType, "isBroken", cc);
        isBroken.setModifiers(Modifier.PUBLIC);
        cc.addField(isBroken, CtField.Initializer.constant(false));

        //Ajouter uniquement si l'indicateur est activé
        m.insertBefore("if(isBroken) value++;");

        //Sortie du fichier de classe modifié
        cc.writeFile();

    }

Ajoutez le traitement des changements d'indicateur à la classe principale.

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

        Integer a = Integer.valueOf(0);

        try {
            //Réécrire isBroken avec réflexion pour éviter les erreurs de compilation
            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();
        }

    }
}

Si vous essayez de modifier la valeur de isBroken of Integer Si vous le réécrivez normalement, le champ n'existe pas, donc J'obtiens une erreur de compilation. Par conséquent, en réécrivant avec réflexion, une erreur d'exécution se produira si elle n'existe pas. Vous pouvez voir l'horreur de la réflexion ...

Résultat d'exécution De plus, si vous ajoutez -Xbootclasspath / p: . à l'argument d'exécution et que vous l'exécutez,

true

J'ai réussi à changer (a == 1 && a == 2 && a == 3) en true en Java.

Résumé

Recommended Posts

Je l'ai fait en Java pour toujours rendre (a == 1 && a == 2 && a == 3) vrai
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
J'ai essayé de créer une fonction de connexion avec Java
Comment créer un conteneur Java
Comment créer un tableau Java
Je veux faire une liste avec kotlin et java!
Je voulais juste créer une propriété réactive en Java
Je veux créer une fonction avec kotlin et java!
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
J'ai créé un client RESAS-API en Java
Comment créer un robot Discord (Java)
[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
J'ai essayé de faire une authentification de base avec Java
java j'ai essayé de casser un simple bloc
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (édition PowerMockito)
Ce que j'ai fait lorsque j'ai converti Java en Kotlin
J'ai essayé de créer une application de conversation en Java à l'aide de l'IA «A3RT»
J'ai essayé de casser le bloc avec java (1)
Même en Java, je veux sortir true avec un == 1 && a == 2 && a == 3 (deuxième décoction Javassist)
[Petite histoire] J'ai essayé de rendre java ArrayList un peu plus pratique
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (Black Magic)
J'ai essayé de créer une compétence Clova en Java
J'avais l'habitude de faire nc (netcat) avec JAVA normalement
[Java] Rendez-le constant
Faire un diamant en utilisant Java
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
J'ai essayé de moderniser une application Java EE avec OpenShift.
[Java] Je souhaite convertir un tableau d'octets en un nombre hexadécimal
[Débutant] Essayez de créer un jeu RPG simple avec Java ①
[Débutant] J'ai créé un programme pour vendre des gâteaux en Java
Je souhaite créer un modèle spécifique d'ActiveRecord ReadOnly
J'ai essayé de faire coexister Java Optional et la clause de garde
J'ai essayé de convertir une chaîne de caractères en un type LocalDate en Java
J'ai créé un Dockerfile pour démarrer Glassfish 5 en utilisant Oracle Java
[Java] J'ai essayé de créer un jeu Janken que les débutants peuvent exécuter sur la console
Essayez de faire un simple rappel
J'ai créé un PDF avec Java.
J'ai créé une application shopify @java
Comment créer un pilote JDBC
J'ai essayé d'interagir avec Java
Comment créer un écran de démarrage
Comment créer un plug-in Jenkins
Comment faire un projet Maven
J'ai essayé de résumer l'apprentissage Java (1)
J'ai essayé de résumer Java 8 maintenant
Essayez de créer un itérateur qui puisse être vu
[Unity] J'ai essayé de créer un plug-in natif UniNWPathMonitor en utilisant NWPathMonitor
Création d'une méthode pour demander Premium Friday (version Java 8)
J'ai essayé de créer une application Android avec MVC maintenant (Java)
Comment faire un diamant révolutionnaire en utilisant Java pour déclaration wwww
J'ai essayé de créer une fonction de groupe (babillard) avec Rails
J'ai essayé de créer une simple application Android de reconnaissance faciale en utilisant OpenCV
Je veux écrire un joli build.gradle
Je veux créer une application ios.android
J'ai essayé de résumer les expressions Java lambda
J'étais accro à un simple test de Jedis (bibliothèque Java-> Redis)
[Java / kotlin] Kai ・ Comment créer un Discord Bot - Implémentons une commande pour saluer
[iOS] J'ai essayé de créer une application de traitement de type insta avec Swift
[JAVA] Project Euler, je suis resté coincé au Q8, alors prenez note