IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

A quoi sert sun.reflect.MagicAccessorImpl ?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 141
    Par défaut A quoi sert sun.reflect.MagicAccessorImpl ?
    Bonjour,

    Voila je viens de découvrir dans le jdk la classe MagicAccessorImpl. En lisant la javadoc, j'ai compris que toutes classes heritant de la classe MagicAccessorImpl peut acceder à tous les attributs et des méthodes qui normalement n'a pas accès...

    J'ai essayer de faire un exemple mais cela ne fonctionne pas :

    Une classe qui herite de MagicAccessorImpl qui dispose d'une méthode en parametre de cette méthode je donne un instance d'une classe qui possède un type privée...

    Je pense avoir mal compris la javadoc, quelq'un aurait une explication et un exemple simple ?

    Merci

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tout ce qui est dans les packages sun.* tu peux oublier que ça existe. Ce n'est pas standard, non portable et suceptible de changer d'une version à l'autre de la jvm.

    Ensuite, il y a fort à parier que le security manager n'autorise cette "magie" que pour des classes provenant de la jdk et pas les autres, sinon tu va avoir de sacré problèmes de sécurité.

    Enfin, ce n'est pas parce que la jvm autorise cette classe à tout voir, que le compilateur est d'accord avec. Tu va devoir passer outre le compilateur, et comme la doc l'indique, c'est destiné à être utilisé par des classes générées dynamiquement.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 141
    Par défaut
    Merci pour votre réponse en effet c'est utilisé dans une api pour le code généré par asm.

    Pour comprendre son fonctionnement j'ai fait un petit exemple tout bête en générant le bytecode avec asm 4.1 et a l’exécution, j'ai bien accès a tout si la classe hérite de MagicAccessorImpl.

    C'est toujours bon à savoir.

    Merci encore

    Voici un exemple tout bête pour ceux qu'ils veulent tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    package test;
     
    import classloader.MagicClassLoader;
     
    public class Test {
     
    	/**
             * @param args
             * @throws ClassNotFoundException
             * @throws IllegalAccessException
             * @throws InstantiationException
             */
    	public static void main(String[] args) throws ClassNotFoundException,
    			InstantiationException, IllegalAccessException {
    		MagicClassLoader magicClassLoader = new MagicClassLoader(
    				ClassLoader.getSystemClassLoader());
     
    		Class localClass = Class.forName("test.Access", true, magicClassLoader);
    		localClass.newInstance();
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package classloader;
     
    import test.AsmVisitor;
     
    public class MagicClassLoader extends ClassLoader {
     
    	public MagicClassLoader(ClassLoader paramClassLoader) {
    		super(paramClassLoader);
    	}
     
    	@Override
    	protected Class<?> findClass(String name) throws ClassNotFoundException {
    		System.out.println(name);
    		if (name.equals("test.Access")) {
    			byte[] generate = AsmVisitor.generate();
    			return defineClass(name, generate, 0, generate.length, null);
    		}
    		return super.findClass(name);
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    package test;
     
    import java.io.FileOutputStream;
    import java.io.IOException;
     
    import org.objectweb.asm.ClassWriter;
    import org.objectweb.asm.MethodVisitor;
    import org.objectweb.asm.Opcodes;
     
    public class AsmVisitor {
     
    	private static String SUPER_CLASS_0 = "sun/reflect/SuperMagic";
    	private static String SUPER_CLASS_1 = "java/lang/Object";
     
    	public static byte[] generate() {
    		ClassWriter cw = new ClassWriter(0);
    		cw.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER,
    				"test/Access", null, SUPER_CLASS_0, null);
     
    		MethodVisitor visitMethod = cw.visitMethod(1, "<init>", "()V", null,
    				null);
     
    		visitMethod.visitCode();
    		visitMethod.visitVarInsn(Opcodes.ALOAD, 0);
    		visitMethod.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object",
    				"<init>", "()V");
    		visitMethod.visitMethodInsn(Opcodes.INVOKESTATIC, "test/ClassPrivee",
    				"privateMethod", "()V");
    		visitMethod.visitInsn(Opcodes.RETURN);
    		visitMethod.visitMaxs(1, 1);
     
    		visitMethod.visitEnd();
     
    		cw.visitEnd();
    		return cw.toByteArray();
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    package test;
     
    public class ClassPrivee {
     
    	private static void privateMethod() {
    		System.out.println("Super C'est privée");
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    package sun.reflect;
     
    public class SuperMagic extends MagicAccessorImpl {
     
    }
    et pour info, voici la code de la classe généré "Access"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
    // Jad home page: http://www.kpdus.com/jad.html
    // Decompiler options: packimports(3) 
     
    package test;
     
    import sun.reflect.SuperMagic;
     
    // Referenced classes of package test:
    //            ClassPrivee
     
    public class Access extends SuperMagic
    {
     
        public Access()
        {
            super();
            ClassPrivee.privateMethod();
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. A quoi sert XML-Schema
    Par Community Management dans le forum Valider
    Réponses: 20
    Dernier message: 26/01/2009, 09h52
  2. à quoi sert le délestage?
    Par r0d dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 5
    Dernier message: 06/10/2004, 14h34
  3. a quoi sert le schema dans postgres ??
    Par champion dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 13/09/2004, 10h25
  4. [info] A quoi sert ImageObserver ?
    Par FrigoAcide dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 22/03/2004, 17h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo