OSGi WeavingHook Используя Тест

У кого-нибудь есть примеры использования OSGi Weaving Hook Service? Я делаю некоторые тесты на этом. Но встретить некоторые проблемы. что я хочу сделать, это изменить байт-код класса в Bundle. Например: Bundle A регистрирует Weaving Hook Service и использует ASM для изменения класса в Bundle B.

Пакет А:

import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Instantiate;
import org.apache.felix.ipojo.annotations.Provides;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;
import org.osgi.framework.hooks.weaving.WeavingHook;
import org.osgi.framework.hooks.weaving.WovenClass;

 @Component
 @Provides
 @Instantiate
 public class TWMethodCallsHook implements WeavingHook {

public void weave(WovenClass wovenClass) {
    // TODO Auto-generated method stub
        if(inInstrumented(wovenClass.getClassName())){

            System.out.println("Instrumenting{}");
            System.out.println(wovenClass.getBundleWiring().getBundle().getBundleId());
            final ClassReader cr=new ClassReader(wovenClass.getBytes());
            final ClassWriter cw=new ClassWriter(cr,ClassWriter.COMPUTE_MAXS);
            final ClassVisitor v=new TClassVisitor(cw);
            System.out.println(wovenClass.getBytes());
            cr.accept(v,Opcodes.ASM5);
            byte[]code= cw.toByteArray();
            System.out.println(code.toString());
            wovenClass.setBytes(cw.toByteArray());
        }
}

private boolean inInstrumented(String className) {

    return className.contains("people");

}

 }

======================

package per.osgi.weavingHookText.Adapter;

import org.objectweb.asm.ClassVisitor;

import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;

public class TClassVisitor extends ClassVisitor {

private final ClassVisitor cw;

public TClassVisitor(final ClassVisitor cw) {
    super(Opcodes.ASM5, cw);
    this.cw = cw;
    // TODO Auto-generated constructor stub
}
 @Override
    public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
     super.visit(version, access, name, signature, name, interfaces);
    }
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {

    if("say".equals(name)){

        MethodVisitor mv=cw.visitMethod(access, name, desc, signature, exceptions);
        return new TMethodVisitor(mv);

    }
    return null;
}

}

===================================

package per.osgi.weavingHookText.Adapter;

import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;

public class TMethodVisitor extends MethodVisitor {

public TMethodVisitor(MethodVisitor mv){
    super(Opcodes.ASM5,mv);
}

@Override
public void visitCode(){

    mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
    mv.visitLdcInsn("========start=========");
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
    super.visitCode();
}
 }

============================ BUNDLE b

package per.osgi.weavingHookTest.Target;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Target implements BundleActivator {
    //public people a=new people();
public void start(BundleContext context) throws Exception {
    // TODO Auto-generated method stub
    //a.say();
}

public void stop(BundleContext context) throws Exception {
    // TODO Auto-generated method stub

}

}

package per.osgi.weavingHookTest.Target;

public class people {
public void say(){

}
}

================================= Я хочу вставить некоторый код в класс людей.

Но случается какая-то ошибка. Bundle B не может запуститься... Я хочу знать, что на самом деле происходит...

На самом деле я не знаю, можно ли вставить код в другой пакет

Консоль

Ошибка

Instrumenting{}
16
[B@2269ab25
[B@6192f5fb
gogo: BundleException: Error starting module.

Спасибо за помощь.

Когда я начинаю работу с B, кое-что происходит.

0 ответов

Другие вопросы по тегам