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

API standards et tierces Java Discussion :

Probleme avec ASM (Java bytecode manipulation)


Sujet :

API standards et tierces Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 67
    Points : 42
    Points
    42
    Par défaut Probleme avec ASM (Java bytecode manipulation)
    J'arrive pas utiliser TraceMethodVisitor avec ASM.
    c'est censé m'afficher le bytecode de la méthode une fois qu'elle a été modifié. Pourtant rien ne ce passe.

    j'utilise un agent et une classe ClassFileTransformer pour modifier dynamiquement les classes lorsqu'elles sont lues pars la JVM

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    public byte[] transform(ClassLoader loader, String className, Class redefiningClass, ProtectionDomain domain, byte[] bytes) throws IllegalClassFormatException {
     
    		System.out.println("--->Modifying: " + className);
     
    		byte[] result = bytes;
    		try {
     
    				ClassReader reader = new ClassReader(bytes);
    				ClassWriter writer = new ClassWriter(reader, ClassWriter.COMPUTE_MAXS);
    				//TraceClassmv.visitor tcv = new TraceClassmv.visitor(writer,new PrintWriter(System.out));
    				MyClassAdapter mca = new MyClassAdapter(writer /*tcv*/, className);
    				reader.accept(mca , ClassReader.SKIP_DEBUG);
    				result = writer.toByteArray();		
    		}
    		catch(Exception e) {
    		    e.printStackTrace();
    		}
    		return result;
        }
     
    /********************************ClassAdapter**************************************/	
     
        private class MyClassAdapter extends ClassAdapter {
     
    		private String className;
     
    		MyClassAdapter(ClassVisitor cv, String theClass) {
    		    super(cv);
    		    className = theClass;
    		}
     
    		@Override public void visit(int arg0, int access, String name, String signature,String superName, String[] interfaces) {
    			cv.visit(arg0, access, name, signature, superName, interfaces);	
    		}
     
    		@Override public MethodVisitor visitMethod(int arg0, String name, String descriptor, String signature, String[] exceptions) {
    		    MethodVisitor mv = cv.visitMethod(arg0, name, descriptor, signature, exceptions);
    		    //Everytime I modify a method I will see the resulting method
    			mv = new TraceMethodVisitor(mv){
    				    @Override public void visitCode(){
    				    		print(new PrintWriter(System.out));
    				    }
    			    };
     
    		    return new MyMethodAdapter(mv,className,name,descriptor);
    		}
        }
     
    /********************************MethodAdapter**************************************/	
     
        private class MyMethodAdapter extends MethodAdapter {
    	private String methodName;
    	private String methodDescriptor;
    	private String className;
    	//private Methodmv.visitor mv.visitor;
     
    	MyMethodAdapter(MethodVisitor mv, String theClass, String name, String descriptor) {
    	    super(mv);
    	    //this.mv.visitor = mv.visitor;
    	    methodName = name;
    	    methodDescriptor = descriptor;
    	    className = theClass;
    	}
     
    		@Override public void visitCode() {
    			//Every method print her name at the beginning
    			mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
    			mv.visitLdcInsn("Method " + className + "." + methodName + "(" + methodDescriptor + ") called");
    			mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
     
    		}
     
    	}
     
    /**********************************************************************/
    }
    Toute les méthodes sont modifiées pour tant aucun bytecode n'est affiché.
    j'utilise mal le TraceMethodVisitor (pourtant j'ai fais exactement pareil que dans le asm-guide page 60)

  2. #2
    Candidat au Club
    Inscrit en
    Mars 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 3
    Points : 4
    Points
    4
    Par défaut svp aidez moi
    désolé je vais pas répondre à ta question
    mais svp, je dois réaliser un outil qui fait la transformation d'une spécification dans un langage à une autre spécificationdans un autre langage. je cherche un outil qui je lui donne les grammaires de deux langages et les règles de transformations qui j'ai déjà défini et à lui de faire l'implémentation,je trouve cet outil, svp c'est cet outil répond à mes besoins décrire moi un peu comment je l'utilise et d'où je peux le télécharger.
    merci

Discussions similaires

  1. probleme avec JOSSO java open single sigon on
    Par sayah_houssein dans le forum Tomcat et TomEE
    Réponses: 0
    Dernier message: 24/02/2011, 22h44
  2. Probleme avec target java
    Par ploxien dans le forum ANT
    Réponses: 2
    Dernier message: 18/05/2007, 14h13
  3. [REDHAT] Probleme avec la java RE
    Par blackstreet dans le forum RedHat / CentOS / Fedora
    Réponses: 9
    Dernier message: 15/06/2006, 10h22
  4. Debutant en JAVA, problème avec 1er programme
    Par Gymerus dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 07/09/2005, 12h10

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