public static String toSignature(Method exec) { StringBuilder sb = new StringBuilder(); sb.append("("); for(Class<?> clazz : exec.getParameterTypes()) { sb.append(AsmUtils.toTargetTypeDeclaration(clazz)); } sb.append(")"); sb.append(AsmUtils.toTargetTypeDeclaration(exec.getReturnType())); return sb.toString(); }
@Override public void addDeclaration(ClassWriter cw) { { FieldVisitor fvSetter = cw.visitField(ACC_PRIVATE + ACC_FINAL, prefix + index+ "Setter", toTargetTypeDeclaration(AsmUtils.toAsmType(setterClass)), toTargetTypeDeclaration(AsmUtils.toGenericAsmType(setterClass)), null); fvSetter.visitEnd(); } }
@Override public void addDeclaration(ClassWriter cw) { { FieldVisitor fvGetter = cw.visitField(ACC_PRIVATE + ACC_FINAL, prefix + index + "Getter", toTargetTypeDeclaration(AsmUtils.toAsmType(getterClass)), toTargetTypeDeclaration(AsmUtils.toGenericAsmType(getterClass)), null); fvGetter.visitEnd(); } { FieldVisitor fvSetter = cw.visitField(ACC_PRIVATE + ACC_FINAL, prefix + index+ "Setter", toTargetTypeDeclaration(AsmUtils.toAsmType(setterClass)), toTargetTypeDeclaration(AsmUtils.toGenericAsmType(setterClass)), null); fvSetter.visitEnd(); } } }
@Override public void addDeclaration(ClassWriter cw) { { FieldVisitor fvGetter = cw.visitField(ACC_PRIVATE + ACC_FINAL, prefix + index + "Getter", toTargetTypeDeclaration(AsmUtils.toAsmType(getterClass)), toTargetTypeDeclaration(AsmUtils.toGenericAsmType(getterClass)), null); fvGetter.visitEnd(); } { FieldVisitor fvSetter = cw.visitField(ACC_PRIVATE + ACC_FINAL, prefix + index+ "Setter", toTargetTypeDeclaration(AsmUtils.toAsmType(setterClass)), toTargetTypeDeclaration(AsmUtils.toGenericAsmType(setterClass)), null); fvSetter.visitEnd(); } } }
private static <S> void appendGetters(Map<Parameter, Getter<? super S, ?>> injections, ClassWriter cw) { FieldVisitor fv; for(Entry<Parameter, Getter<? super S, ?>> entry : injections.entrySet()) { GetterCall getterCall = getGetterCall(entry.getKey().getType(), entry.getValue().getClass()); fv = cw.visitField(ACC_FINAL, "getter_" + entry.getKey().getName(), AsmUtils.toTargetTypeDeclaration(getterCall.getterType), null, null); fv.visitEnd(); } }
@Override public void addDeclaration(ClassWriter cw) { Type mapperClass = AsmUtils.findClosestPublicTypeExposing(mapper.getClass(), FieldMapper.class); FieldVisitor fv = cw.visitField(ACC_PRIVATE + ACC_FINAL, prefix + index, toTargetTypeDeclaration(AsmUtils.toAsmType(mapperClass)), toTargetTypeDeclaration(AsmUtils.toGenericAsmType(mapperClass)), null); fv.visitEnd(); } }
@Override public void addDeclaration(ClassWriter cw) { Type mapperClass = AsmUtils.findClosestPublicTypeExposing(mapper.getClass(), FieldMapper.class); FieldVisitor fv = cw.visitField(ACC_PRIVATE + ACC_FINAL, prefix + index, toTargetTypeDeclaration(AsmUtils.toAsmType(mapperClass)), toTargetTypeDeclaration(AsmUtils.toGenericAsmType(mapperClass)), null); fv.visitEnd(); } }
public static String toTargetTypeDeclaration(Type targetType) { if (TypeHelper.isPrimitive(targetType)) { return primitivesType.get(TypeHelper.toClass(targetType)); } return toTargetTypeDeclaration(AsmUtils.toAsmType(targetType)); } public static String toTargetTypeDeclaration(String targetType) {
public static String toTargetTypeDeclaration(Type targetType) { if (TypeHelper.isPrimitive(targetType)) { return primitivesType.get(TypeHelper.toClass(targetType)); } return toTargetTypeDeclaration(AsmUtils.toAsmType(targetType)); } public static String toTargetTypeDeclaration(String targetType) {
private static <S1, S2> void appendFunctionsField(List<InjectionPoint> injections, ClassWriter cw) { for(InjectionPoint injectionPoint : injections) { FieldVisitor fv = cw.visitField(ACC_FINAL, getBiFunctionFieldName(injectionPoint.parameter), AsmUtils.toTargetTypeDeclaration(injectionPoint.functionType), null, null); fv.visitEnd(); } }
@Test public void testToTargetTypeDeclaration() { assertEquals("I", AsmUtils.toTargetTypeDeclaration(int.class)); assertEquals("Ljava/lang/String;", AsmUtils.toTargetTypeDeclaration(String.class)); assertEquals("[Ljava/lang/String;", AsmUtils.toTargetTypeDeclaration(String[].class)); assertEquals("Ljava/lang/String;", AsmUtils.toTargetTypeDeclaration("java/lang/String")); assertEquals("[Ljava/lang/String;", AsmUtils.toTargetTypeDeclaration("[Ljava/lang/String;")); }
private static <S> void appendInitGetters(Map<Parameter, Getter<? super S, ?>> injections, String classType, MethodVisitor mv) { for(Entry<Parameter, Getter<? super S, ?>> entry : injections.entrySet()) { String name = entry.getKey().getName(); GetterCall getterCall = getGetterCall(entry.getKey().getType(), entry.getValue().getClass()); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitLdcInsn(name); mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get", "(Ljava/lang/Object;)Ljava/lang/Object;", true); mv.visitTypeInsn(CHECKCAST, AsmUtils.toAsmType(getterCall.getterType)); mv.visitFieldInsn(PUTFIELD, classType, "getter_" + name, AsmUtils.toTargetTypeDeclaration(getterCall.getterType)); } }
private static void appendBridge(ClassWriter cw, String targetType, String propertyType, String classType) { MethodVisitor mv; mv = cw.visitMethod(ACC_PUBLIC + ACC_BRIDGE + ACC_SYNTHETIC, "get", "(Ljava/lang/Object;)Ljava/lang/Object;", null, new String[] { "java/lang/Exception" }); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(CHECKCAST, targetType); mv.visitMethodInsn(INVOKEVIRTUAL, classType, "get", "(" + AsmUtils.toTargetTypeDeclaration(targetType) + ")" + AsmUtils.toTargetTypeDeclaration(propertyType), false); mv.visitInsn(ARETURN); mv.visitMaxs(2, 2); mv.visitEnd(); }
@Override public void addInit(MethodVisitor mv, String mapperClassType) { String fieldMapperType = AsmUtils.toAsmType(mapper.getClass()); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, prefix == CONSTRUCTOR_MAPPER_PREFIX ? 2 : 1); AsmUtils.addIndex(mv, index); mv.visitInsn(AALOAD); mv.visitTypeInsn(CHECKCAST, fieldMapperType); mv.visitFieldInsn(GETFIELD, fieldMapperType, "setter", toTargetTypeDeclaration(AsmUtils.toAsmType(declaredSetterClass))); mv.visitTypeInsn(CHECKCAST, AsmUtils.toAsmType(setterClass)); mv.visitFieldInsn(PUTFIELD, mapperClassType, prefix + index + "Setter", toTargetTypeDeclaration(AsmUtils.toAsmType(setterClass))); }
@Override public void addInit(MethodVisitor mv, String mapperClassType) { String fieldMapperType = AsmUtils.toAsmType(mapper.getClass()); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, prefix == CONSTRUCTOR_MAPPER_PREFIX ? 2 : 1); AsmUtils.addIndex(mv, index); mv.visitInsn(AALOAD); mv.visitTypeInsn(CHECKCAST, fieldMapperType); mv.visitFieldInsn(GETFIELD, fieldMapperType, "setter", toTargetTypeDeclaration(AsmUtils.toAsmType(declaredSetterClass))); mv.visitTypeInsn(CHECKCAST, AsmUtils.toAsmType(setterClass)); mv.visitFieldInsn(PUTFIELD, mapperClassType, prefix + index + "Setter", toTargetTypeDeclaration(AsmUtils.toAsmType(setterClass))); }
@Override public void addMappingCall(MethodVisitor mv, String mapperClassType) throws NoSuchMethodException { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, mapperClassType, prefix + index + "Setter", toTargetTypeDeclaration(AsmUtils.toAsmType(setterClass))); mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, mapperClassType, prefix + index + "Getter", toTargetTypeDeclaration(AsmUtils.toAsmType(getterClass))); mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 3); AsmUtils.invoke(mv, getMethod); AsmUtils.invoke(mv, setMethod); }
@Override public void addInit(MethodVisitor mv, String mapperClassType) { Type mapperClass = AsmUtils.findClosestPublicTypeExposing(mapper.getClass(), FieldMapper.class); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, prefix == CONSTRUCTOR_MAPPER_PREFIX ? 2 : 1); AsmUtils.addIndex(mv, index); mv.visitInsn(AALOAD); mv.visitTypeInsn(CHECKCAST, AsmUtils.toAsmType(mapperClass)); mv.visitFieldInsn(PUTFIELD, mapperClassType, prefix + index, toTargetTypeDeclaration(AsmUtils.toAsmType(mapperClass))); }
@Override public void addInit(MethodVisitor mv, String mapperClassType) { Type mapperClass = AsmUtils.findClosestPublicTypeExposing(mapper.getClass(), FieldMapper.class); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, prefix == CONSTRUCTOR_MAPPER_PREFIX ? 2 : 1); AsmUtils.addIndex(mv, index); mv.visitInsn(AALOAD); mv.visitTypeInsn(CHECKCAST, AsmUtils.toAsmType(mapperClass)); mv.visitFieldInsn(PUTFIELD, mapperClassType, prefix + index, toTargetTypeDeclaration(AsmUtils.toAsmType(mapperClass))); }
@Override public void addMappingCall(MethodVisitor mv, String mapperClassType) throws NoSuchMethodException { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, mapperClassType, prefix + index + "Setter", toTargetTypeDeclaration(AsmUtils.toAsmType(setterClass))); mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 3); AsmUtils.addIndex(mv, getterIndex); AsmUtils.invoke(mv, getMethod); AsmUtils.invoke(mv, setMethod); }
@Override public void addMappingCall(MethodVisitor mv, String mapperClassType) throws NoSuchMethodException { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, mapperClassType, prefix + index + "Setter", toTargetTypeDeclaration(AsmUtils.toAsmType(setterClass))); mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 3); AsmUtils.addIndex(mv, getterIndex); AsmUtils.invoke(mv, getMethod); AsmUtils.invoke(mv, setMethod); }