Java OSGi编织钩使用测试

Java OSGi编织钩使用测试,java,osgi,apache-felix,ipojo,Java,Osgi,Apache Felix,Ipojo,有人真的有使用OSGi编织钩子服务的例子吗? 我正在做一些测试,但是遇到了一些问题。我想做的是修改Bundle中类的字节码。例如:捆绑包A注册编织钩子服务,并使用ASM修改捆绑包B中的类 捆绑包A: import org.apache.felix.ipojo.annotations.Component; import org.apache.felix.ipojo.annotations.Instantiate; import org.apache.felix.ipojo.annotations.

有人真的有使用OSGi编织钩子服务的例子吗?
我正在做一些测试,但是遇到了一些问题。我想做的是修改Bundle中类的字节码。例如:捆绑包A注册编织钩子服务,并使用ASM修改捆绑包B中的类

捆绑包A:

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();
}
 }
package per.osgi.weavingHookTest.Target;

public class people {
public void say(){
    
}
}
}

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

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();
}
 }
package per.osgi.weavingHookTest.Target;

public class people {
public void say(){
    
}
}
============================ 束b

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

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();
}
 }
package per.osgi.weavingHookTest.Target;

public class people {
public void say(){
    
}
}
================================= 我想在类中插入一些代码

但是发生了一些错误。捆绑包B无法启动。。。 我想知道到底发生了什么

实际上,我不知道是否可以将代码插入到另一个包中

[控制台][1]

[错误][2]

Instrumenting{}
16
[B@2269ab25
[B@6192f5fb
gogo: BundleException: Error starting module.
谢谢你的帮助

当我启动Bundle B时,有些事情发生了。 [1]:
[2] :

“但有些错误”-如果我以前问过,我已经问了一千次了。。。什么错误?对不起…我是新来的,请不要将错误作为图片发布。这使得那些在未来面临类似错误的人更难找到这个问题并从其答案中获益。“但有些错误”-如果我以前问过,我已经问过一千次了。。。什么错误?对不起…我是新来的,请不要将错误作为图片发布。这使得那些在未来面临类似错误的人更难找到这个问题并从中受益。