// @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(); }