use of jodd.asm5.Type in project tomee by apache.
the class CmrField method createSignature.
private static String createSignature(final Type type, final Type... genericTypes) {
final StringBuilder builder = new StringBuilder();
builder.append("L").append(type.getInternalName());
if (genericTypes.length > 0) {
builder.append("<");
for (final Type genericType : genericTypes) {
builder.append(genericType.getDescriptor());
}
builder.append(">");
}
builder.append(";");
return builder.toString();
}
use of jodd.asm5.Type in project tomee by apache.
the class DynamicSubclass method visitConstructor.
private static MethodVisitor visitConstructor(final ClassWriter cw, final String proxyClassFileName, final String classFileName, final Constructor<?> constructor) {
final String descriptor = Type.getConstructorDescriptor(constructor);
final String[] exceptions = new String[constructor.getExceptionTypes().length];
for (int i = 0; i < exceptions.length; i++) {
exceptions[i] = Type.getInternalName(constructor.getExceptionTypes()[i]);
}
final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", descriptor, null, exceptions);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
int index = 1;
for (final Type type : Type.getArgumentTypes(descriptor)) {
mv.visitVarInsn(type.getOpcode(ILOAD), index);
index += size(type);
}
mv.visitMethodInsn(INVOKESPECIAL, classFileName, "<init>", descriptor, false);
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(PUTFIELD, proxyClassFileName, "this$handler", "Ljava/lang/reflect/InvocationHandler;");
mv.visitInsn(RETURN);
mv.visitMaxs(2, 1);
return mv;
}
use of jodd.asm5.Type in project jodd by oblac.
the class BigClassTest method testAllFeatures.
@Test
public void testAllFeatures() throws IOException, IllegalAccessException, InstantiationException {
StatCounter.counter = 0;
final MutableBoolean firstTime = new MutableBoolean(true);
ProxyAspect aspect = new ProxyAspect(StatCounterAdvice.class, new ProxyPointcutSupport() {
public boolean apply(MethodInfo mi) {
if (firstTime.value) {
firstTime.value = false;
ClassInfo ci = mi.getClassInfo();
assertEquals("BigFatJoe", ci.getClassname());
assertEquals(BigFatJoe.class.getPackage().getName(), ci.getPackage());
assertEquals("jodd/proxetta/data/BigFatJoe", ci.getReference());
assertEquals("jodd/proxetta/data/SmallSkinnyZoe", ci.getSuperName());
AnnotationInfo[] anns = ci.getAnnotations();
assertNotNull(anns);
assertEquals(3, anns.length);
AnnotationInfo ai = anns[0];
assertSame(ai, getAnnotation(ci, MadvocAction.class));
assertEquals(MadvocAction.class.getName(), ai.getAnnotationClassname());
assertEquals("L" + MadvocAction.class.getName().replace('.', '/') + ";", ai.getAnnotationSignature());
assertEquals("madvocAction", ai.getElement("value"));
ai = anns[1];
assertSame(ai, getAnnotation(ci, PetiteBean.class));
assertEquals(PetiteBean.class.getName(), ai.getAnnotationClassname());
assertEquals("L" + PetiteBean.class.getName().replace('.', '/') + ";", ai.getAnnotationSignature());
ai = anns[2];
assertSame(ai, getAnnotation(ci, InterceptedBy.class));
assertEquals(InterceptedBy.class.getName(), ai.getAnnotationClassname());
assertEquals("L" + InterceptedBy.class.getName().replace('.', '/') + ";", ai.getAnnotationSignature());
assertTrue(ai.getElement("value") instanceof Object[]);
assertFalse(ai.getElement("value") instanceof String[]);
Object c1 = ((Object[]) ai.getElement("value"))[0];
assertEquals("Ljodd/proxetta/data/Str;", ((Type) c1).getDescriptor());
}
if (mi.getMethodName().equals("publicMethod")) {
AnnotationInfo[] anns = mi.getAnnotations();
assertNotNull(anns);
assertEquals(3, anns.length);
AnnotationInfo ai = anns[0];
assertSame(ai, getAnnotation(mi, Action.class));
assertEquals(Action.class.getName(), ai.getAnnotationClassname());
assertEquals("value", ai.getElement("value"));
assertEquals("alias", ai.getElement("alias"));
ai = anns[1];
assertSame(ai, getAnnotation(mi, PetiteInject.class));
assertEquals(PetiteInject.class.getName(), ai.getAnnotationClassname());
assertEquals(0, ai.getElementNames().size());
ai = anns[2];
assertSame(ai, getAnnotation(mi, Transaction.class));
assertEquals(Transaction.class.getName(), ai.getAnnotationClassname());
assertEquals(2, ai.getElementNames().size());
String s = (String) ai.getElement("propagation");
assertEquals("PROPAGATION_REQUIRES_NEW", s);
}
if (mi.getMethodName().equals("superPublicMethod")) {
AnnotationInfo[] anns = mi.getAnnotations();
assertNotNull(anns);
assertEquals(3, anns.length);
AnnotationInfo ai = anns[0];
assertSame(ai, getAnnotation(mi, Action.class));
assertEquals(Action.class.getName(), ai.getAnnotationClassname());
assertEquals(0, ai.getElementNames().size());
ai = anns[1];
assertSame(ai, getAnnotation(mi, PetiteInject.class));
assertEquals(PetiteInject.class.getName(), ai.getAnnotationClassname());
assertEquals(0, ai.getElementNames().size());
ai = anns[2];
assertSame(ai, getAnnotation(mi, Transaction.class));
assertEquals(Transaction.class.getName(), ai.getAnnotationClassname());
assertEquals(0, ai.getElementNames().size());
}
//System.out.println(!isRootMethod(mi) + " " + mi.getDeclaredClassName() + '#' + mi.getMethodName());
return !isRootMethod(mi);
}
});
byte[] classBytes = ProxyProxetta.withAspects(aspect).builder(BigFatJoe.class).create();
// URL resource = BigFatJoe.class.getResource("/" + BigFatJoe.class.getName().replace(".", "/") + ".class");
// jodd.io.FileUtil.copy(FileUtil.toFile(resource), new java.io.File(SystemUtil.getUserHome(), "jo.class"));
// jodd.io.FileUtil.writeBytes(new java.io.File(SystemUtil.getUserHome(), "joe.class"), classBytes);
Class clazz = ClassLoaderUtil.defineClass(null, classBytes);
BigFatJoe bigFatJoe = (BigFatJoe) clazz.newInstance();
assertEquals(BigFatJoe.class.getName() + "$$Proxetta", bigFatJoe.getClass().getName());
assertEquals(BigFatJoe.class, ProxettaUtil.getTargetClass(bigFatJoe.getClass()));
// test invocation
// 2 x static + 1 x instance
assertEquals(3, StatCounter.counter);
bigFatJoe.publicMethod();
assertEquals(4, StatCounter.counter);
bigFatJoe.callInnerMethods();
// private method is not overridden
assertEquals(7, StatCounter.counter);
bigFatJoe.superPublicMethod();
assertEquals(8, StatCounter.counter);
bigFatJoe.callInnerMethods2();
// only public super methods are overridden
assertEquals(9, StatCounter.counter);
// test class annotation
MadvocAction ma = (MadvocAction) clazz.getAnnotation(MadvocAction.class);
assertEquals("madvocAction", ma.value());
InterceptedBy ib = (InterceptedBy) clazz.getAnnotation(InterceptedBy.class);
assertNotNull(ib.value());
assertEquals(2, ib.value().length);
// test method annotation
ClassDescriptor cd = ClassIntrospector.lookup(clazz);
Method m = cd.getMethodDescriptor("publicMethod", false).getMethod();
assertNotNull(m);
Annotation[] aa = m.getAnnotations();
assertEquals(3, aa.length);
Action a = (Action) aa[0];
assertEquals("alias", a.alias());
assertEquals("extension", a.extension());
assertEquals("method", a.method());
assertEquals("value", a.value());
PetiteInject pi = (PetiteInject) aa[1];
assertEquals("", pi.value());
Transaction tx = (Transaction) aa[2];
assertTrue(tx.readOnly());
assertEquals(1000, tx.timeout());
assertEquals("PROPAGATION_REQUIRES_NEW", tx.propagation());
bigFatJoe.runInnerClass();
// proxy + call
assertEquals(11, StatCounter.counter);
}
use of jodd.asm5.Type in project jodd by oblac.
the class MethodFinder method visitMethod.
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
if (paramExtractor != null) {
// method already found, skip all further methods
return null;
}
if (!name.equals(methodName)) {
// different method
return null;
}
Type[] argumentTypes = Type.getArgumentTypes(desc);
int dwordsCount = 0;
for (Type t : argumentTypes) {
if (t.getClassName().equals(TYPE_LONG) || t.getClassName().equals(TYPE_DOUBLE)) {
dwordsCount++;
}
}
int paramCount = argumentTypes.length;
if (paramCount != this.parameterTypes.length) {
// different number of params
return null;
}
for (int i = 0; i < argumentTypes.length; i++) {
if (!isEqualTypeName(argumentTypes[i], this.parameterTypes[i])) {
// wrong param types
return null;
}
}
this.paramExtractor = new ParamExtractor((Modifier.isStatic(access) ? 0 : 1), argumentTypes.length + dwordsCount);
return paramExtractor;
}
use of jodd.asm5.Type in project tomee by apache.
the class KeysAnnotationVisitor method visit.
@Override
public void visit(final String name, final Object value) {
if ("value".equals(name)) {
if (value instanceof Type) {
final Type type = (Type) value;
final int sort = type.getSort();
switch(sort) {
case Type.OBJECT:
if (type.getClassName().equals(ValidationRunner.class.getName())) {
classInfos.add(current);
}
break;
}
} else {
currentMethod.keys.add((String) value);
}
}
}
Aggregations