/** * Returns {@link WrapperProxetta} used for building loggable prepared statements. * Initializes proxetta when called for the first time. */ protected BaseLoggableFactory(final Class<T> targetClass) { this.targetClass = targetClass; this.proxetta = Proxetta.wrapperProxetta().withAspect(ProxyAspect.of(LoggableAdvice.class, methodInfo -> { int argumentsCount = methodInfo.getArgumentsCount(); char argumentType = 0; if (argumentsCount >= 1) { argumentType = methodInfo.getArgument(1).getOpcode(); } return methodInfo.getReturnType().getOpcode() == 'V' && // void-returning method argumentType == 'I' && // first argument type methodInfo.isPublicMethod() && methodInfo.getMethodName().startsWith("set") && // set* (argumentsCount == 2 || argumentsCount == 3); // number of arguments })); }
/** * Visits replacement code for {@link ProxyTarget#targetMethodAnnotation(String, String)}. */ public static void targetMethodAnnotation(final MethodVisitor mv, final MethodInfo methodInfo, final String[] args) { AnnotationInfo[] anns = methodInfo.getAnnotations(); if (anns != null) { targetAnnotation(mv, anns, args); } }
@Test void testMethodSignature8() throws IOException { MethodInfo msv = getMethodSignatureForSingleMethod(M8.class); assertEquals(0, msv.getArgumentsCount()); assertEquals(CLASS_SIGNATURE + "$M8", msv.getClassname()); assertEquals("macka#()V", msv.getCleanSignature()); assertEquals("()void", msv.getDeclaration()); assertEquals(CLASS_SIGNATURE + "$M8", msv.getDeclaredClassName()); assertEquals("()V", msv.getDescription()); assertEquals("java/io/IOException,java/lang/NullPointerException", msv.getExceptionsAsString()); assertEquals("macka", msv.getMethodName()); }
@Override public boolean apply(final MethodInfo methodInfo) { return methodInfo.isTopLevelMethod() && methodInfo.isPublicMethod(); } }
@Override public boolean apply(final MethodInfo methodInfo) { return methodInfo.isPublicMethod() && methodInfo.matchMethodName("set*") && methodInfo.hasOneArgument() ; } }
@Override public boolean apply(final MethodInfo methodInfo) { return methodInfo.isPublicMethod() && methodInfo.hasReturnValue() && (methodInfo.matchMethodName("get*") || (methodInfo.matchMethodName("is*"))) && methodInfo.hasNoArguments() ; } }
@Test void testMethodSignature9() throws IOException { MethodInfo msv = getMethodSignatureForSingleMethod(M9.class); assertEquals(1, msv.getArgumentsCount()); assertEquals("java.lang.String[]", msv.getArgument(1).getType()); assertEquals("[Ljava/lang/String;", msv.getArgument(1).getName()); assertEquals("[Ljava/lang/String;", msv.getArgument(1).getRawName()); assertEquals('[', msv.getArgument(1).getOpcode()); assertEquals(CLASS_SIGNATURE + "$M9", msv.getClassname()); assertEquals("main#([Ljava/lang/String;)V", msv.getCleanSignature()); assertEquals("(java.lang.String[])void", msv.getDeclaration()); assertEquals(CLASS_SIGNATURE + "$M9", msv.getDeclaredClassName()); assertEquals("([Ljava/lang/String;)V", msv.getDescription()); assertEquals("main", msv.getMethodName()); }
FooProxyAdvice.class, methodInfo -> { if (methodInfo.getMethodName().equals("p1")) { value.set(methodInfo); return true; assertEquals("p1", mi.getMethodName()); assertEquals(Foo.class.getName().replace('.', '/'), mi.getClassname()); assertEquals("(java.lang.String)java.lang.String", mi.getDeclaration()); assertEquals("(Ljava/lang/String;)Ljava/lang/String;", mi.getDescription()); assertEquals("java.lang.String", mi.getReturnType().getType()); assertEquals("Ljava/lang/String;", mi.getReturnType().getName()); assertEquals("java.lang.String p1(java.lang.String)", mi.getSignature()); assertEquals(1, mi.getArgumentsCount()); assertEquals("Ljava/lang/String;", mi.getArgument(1).getName()); assertTrue(mi.isTopLevelMethod()); AnnotationInfo[] anns = mi.getArgument(1).getAnnotations();
@Test void testMethodSignature10() throws IOException { MethodInfo msv = getMethodSignatureForSingleMethod(M10.class); assertEquals(2, msv.getArgumentsCount()); assertEquals(0, msv.getArgument(1).getAnnotations().length); assertEquals(1, msv.getArgument(2).getAnnotations().length); assertEquals("jodd.proxetta.fixtures.data.FooAnn", msv.getArgument(2).getAnnotations()[0].getAnnotationClassname()); assertEquals("macka", msv.getMethodName()); assertEquals(1, msv.getAnnotations().length); assertEquals("jodd.proxetta.fixtures.data.FooAnn", msv.getAnnotations()[0].getAnnotationClassname()); }
/** * Returns <code>true</code> if method has no argument. */ default boolean hasNoArguments() { return getArgumentsCount() == 0; }
if (methodInfo.getMethodName().equals(INIT)) { if ( (!firstSuperCtorInitCalled) && throw new ProxettaException("Super call detected in class " + methodInfo.getClassname() + " method: " + methodInfo.getSignature() + "\nProxetta can't handle super calls due to VM limitations."); mv.visitInsn(POP); ProxyTargetReplacement.targetClassAnnotation(mv, methodInfo.getClassInfo(), args); wd.proxyApplied = true; return; super.visitLdcInsn(methodInfo.getMethodName()); super.visitLdcInsn(methodInfo.getSignature());
/** * Returns <code>true</code> if method has a return type. */ default boolean hasReturnValue() { return getReturnType().getOpcode() != AsmUtil.TYPE_VOID; }
public static void storeMethodArgumentFromObject(final MethodVisitor mv, final MethodInfo methodInfo, final int index) { int type = methodInfo.getArgument(index).getOpcode(); int offset = methodInfo.getArgumentOffset(index); storeValue(mv, offset, type); }
public boolean apply(MethodInfo methodInfo) { int argumentsCount = methodInfo.getArgumentsCount(); char argumentType = 0; if (argumentsCount >= 1) { argumentType = methodInfo.getArgumentOpcodeType(1); } return methodInfo.getReturnOpcodeType() == 'V' && // void-returning method argumentType == 'I' && // first argument type methodInfo.isTopLevelMethod() && // top-level methodInfo.getMethodName().startsWith("set") && // set* (argumentsCount == 2 || argumentsCount == 3); // number of arguments } }));
if (firstTime.value) { firstTime.value = false; ClassInfo ci = mi.getClassInfo(); assertEquals("BigFatJoe", ci.getClassname()); assertEquals(BigFatJoe.class.getPackage().getName(), ci.getPackage()); if (mi.getMethodName().equals("publicMethod")) { AnnotationInfo[] anns = mi.getAnnotations(); assertNotNull(anns); assertEquals(3, anns.length); assertSame(ai, mi.getAnnotation(Action.class)); assertEquals(Action.class.getName(), ai.getAnnotationClassname()); assertEquals("value", ai.getElement("value")); assertSame(ai, mi.getAnnotation(PetiteInject.class)); assertEquals(PetiteInject.class.getName(), ai.getAnnotationClassname()); assertEquals(0, ai.getElementNames().size()); assertSame(ai, mi.getAnnotation(Transaction.class)); assertEquals(Transaction.class.getName(), ai.getAnnotationClassname()); assertEquals(2, ai.getElementNames().size()); if (mi.getMethodName().equals("superPublicMethod")) { AnnotationInfo[] anns = mi.getAnnotations(); assertNotNull(anns); assertEquals(3, anns.length); assertSame(ai, mi.getAnnotation(Action.class));
/** * Visits replacement code for {@link ProxyTarget#targetMethodName()}. */ public static void targetMethodName(final MethodVisitor mv, final MethodInfo methodInfo) { mv.visitLdcInsn(methodInfo.getMethodName()); }
if (methodInfo.getMethodName().equals(INIT)) { if ( (firstSuperCtorInitCalled == false) && throw new ProxettaException("Super call detected in class " + methodInfo.getClassname() + " method: " + methodInfo.getSignature() + "\nProxetta can't handle super calls due to VM limitations."); super.visitLdcInsn(methodInfo.getMethodName()); super.visitLdcInsn(methodInfo.getSignature());
WrapperProxetta proxetta = Proxetta.wrapperProxetta().withAspect(new ProxyAspect(StatCounterAdvice.class, methodInfo -> methodInfo.isPublicMethod() && (methodInfo.getMethodName().equals("hello") || methodInfo.getMethodName().equals("ola"))));
varOffset += methodInfo.getAllArgumentsSize(); switch (methodInfo.getReturnType().getOpcode()) { case 'V': mv.visitInsn(ACONST_NULL);
Calc calc = new CalcImpl(); WrapperProxetta proxetta = Proxetta.wrapperProxetta().withAspects(new ProxyAspect(StatCounterAdvice.class, methodInfo -> !methodInfo.isRootMethod() && methodInfo.isPublicMethod()));