예제 #1
0
  @Test
  public void testClassWrapper() throws Exception {
    Calc calc = new CalcImpl();

    WrapperProxetta proxetta =
        WrapperProxetta.withAspects(
            new ProxyAspect(
                StatCounterAdvice.class,
                new ProxyPointcutSupport() {
                  public boolean apply(MethodInfo methodInfo) {
                    return !isRootMethod(methodInfo) && isPublic(methodInfo);
                  }
                }));

    //		proxetta.setDebugFolder("d:\\");

    // wrapper over CLASS
    // resulting object has ALL interfaces
    // resulting object wraps ALL target class methods
    WrapperProxettaBuilder builder = proxetta.builder(calc.getClass());

    Class calc2Class = builder.define();

    Object object = calc2Class.newInstance();

    assertTrue(object instanceof Calc);
    assertEquals(CalcImpl.class, ProxettaUtil.getTargetClass(object.getClass()));
    assertEquals(1, calc2Class.getInterfaces().length);

    builder.injectTargetIntoWrapper(calc, object);

    assertEquals(1, StatCounter.counter); // counter in static block !!!

    Method method = calc2Class.getMethod("hello");
    assertNotNull(method);
    method.invoke(object);

    assertEquals(2, StatCounter.counter);

    method = calc2Class.getMethod("calculate", int.class, int.class);
    assertNotNull(method);
    Integer result = (Integer) method.invoke(object, 3, 7);
    assertEquals(10, result.intValue());

    assertEquals(3, StatCounter.counter);

    assertNotNull(calc2Class.getMethod("customMethod"));
  }
예제 #2
0
  @Test
  public void testClassWrapperCastToInterface() throws Exception {
    Calc calc = new CalcImpl();

    WrapperProxetta proxetta =
        WrapperProxetta.withAspects(
            new ProxyAspect(
                StatCounterAdvice.class,
                new ProxyPointcutSupport() {
                  public boolean apply(MethodInfo methodInfo) {
                    return !isRootMethod(methodInfo) && isPublic(methodInfo);
                  }
                }));

    //		proxetta.setDebugFolder("d:\\");

    // wrapper over CLASS casted to interface,
    // resulting object has ONE interface
    // ALL target methods are wrapped
    WrapperProxettaBuilder builder = proxetta.builder(calc.getClass(), Calc.class, ".CalcImpl2");

    Class<Calc> calc2Class = builder.define();

    Calc calc2 = calc2Class.newInstance();

    builder.injectTargetIntoWrapper(calc, calc2);

    assertEquals(1, StatCounter.counter); // counter in static block !!!

    calc2.hello();

    assertEquals(2, StatCounter.counter);

    assertEquals(10, calc2.calculate(3, 7));

    assertEquals(3, StatCounter.counter);

    assertNotNull(calc2Class.getMethod("customMethod"));
  }