Пример #1
0
  //    @Deprecated
  //    @Test
  public void interceptor()
      throws NotFoundException, CannotCompileException, IllegalAccessException,
          InstantiationException, IOException, ClassNotFoundException, NoSuchMethodException {
    AroundInterceptor aroundInterceptor =
        new AroundInterceptor() {

          @Override
          public void before(Object target, Object[] args) {
            logger.info("BEFORE target:" + target + " args:" + Arrays.toString(args));
          }

          @Override
          public void after(Object target, Object[] args, Object result, Throwable throwable) {
            logger.info(
                "AFTER target: "
                    + target
                    + " args:"
                    + Arrays.toString(args)
                    + " result:"
                    + result
                    + " throwable:"
                    + throwable);
          }
        };
    int interceptorId = INTERCEPTOR_REGISTRY_ADAPTOR.addInterceptor(aroundInterceptor);

    final ClassPool classPool = new ClassPool(true);
    CtClass throwable = classPool.get(Throwable.class.getName());

    CtClass ctClass = classPool.get("com.baidu.oped.apm.profiler.interceptor.JavaAssistTestObject");

    final CtMethod hello = ctClass.getMethod("hello", "(Ljava/lang/String;)Ljava/lang/String;");
    logger.debug("longName:{}", hello.getLongName());
    logger.debug("name:{}", hello.getName());

    String interceptorClassName = AroundInterceptor.class.getName();
    CtClass interceptor = classPool.get(interceptorClassName);
    hello.addLocalVariable("interceptor", interceptor);

    CtClass object = classPool.get(Object.class.getName());
    hello.addLocalVariable("result", object);

    //        hello.insertBefore("{ System.out.println(\"BEFORE\"); }");
    hello.insertBefore(
        "{"
            + "interceptor = ("
            + interceptorClassName
            + ") "
            + InterceptorRegistry.class.getName()
            + ".getSimpleInterceptor("
            + interceptorId
            + ");"
            + "interceptor.before(this, $args);"
            + "}");
    //        hello.addCatch("{" +
    ////            " interceptor.after(ctx);"+
    ////           " AroundInterceptor a = (AroundInterceptor) " +
    // InterceptorRegistry.class.getName() + ".getStaticInterceptor(\"a\");"+
    //                " throw $e;" +
    //                "}", throwable);
    //        hello.insertAfter("{" +
    //                "interceptor.after(this,  $args, ($w)$_, null); " +
    //                "}");

    //       hello.setBody(generatedAroundInterceptor("TestObject", "hello"));
    //       hello.setBody("{ System.out.println(\"ddd\");  }", ClassMap map );
    //       hello.insertBefore(" System.out.println(\" BEFORE +  \");");
    //       hello.insertAfter(" System.out.println($_);");
    //       hello.insertAfter(" System.out.println($r);");
    //       hello.insertAfter(" System.out.println($w);");
    //       hello.insertAfter(" System.out.println($sig);");
    //       hello.insertAfter(" System.out.println($type);");
    //       hello.insertAfter(" System.out.println($class);");
    //       hello.instrument(new ExprEditor() {
    //         public void edit(MethodCall m)
    //         throws CannotCompileException
    //         {
    //             try {
    //                 System.out.println("method call" + m.getMethod().getName());
    //             } catch (NotFoundException e) {
    //                 e.printStackTrace();  //To change body of catch statement use File | Settings
    // | File Templates.
    //             }
    //             String code = generatedAroundInterceptor("TestObject", "hello");
    //             m.replace(code);
    //         }

    //         });
    //        hello.addCatch("System.out.println(\"catch\"); throw $e;", throwable);

    //       hello.setName("__hello");
    //       CtMethod method = CtNewMethod.make("public void hello() { try {__hello(); }
    // catch(Throwable th){throw th;}}", ctClass);

    //         CtMethod method = CtNewMethod.make("public void hello() {
    // System.out.println(\"ddd\"); } catch(Throwable th){throw th;}}", ctClass);
    //       ctClass.addMethod(method);

    //        ctClass.freeze();
    //       ctClass.writeFile("./debug");
    //       ctClass.debugWriteFile("./debug");
    Loader loader = LoaderUtils.createLoader(classPool);
    loader.delegateLoadingOf("com.baidu.oped.apm.bootstrap.");

    Class aClass = loader.loadClass(ctClass.getName());
    Object testObject = aClass.newInstance();

    Method helloMethod = testObject.getClass().getDeclaredMethod("hello", String.class);

    try {
      helloMethod.invoke(testObject, "hello~~");
    } catch (Exception e) {
      Assert.fail(e.getMessage());
    }

    //       o.hello();
  }