use of org.apache.xbean.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 org.apache.xbean.asm5.Type in project apex-malhar by apache.
the class BeanClassGenerator method addSetter.
/**
* Add public setter for given field
* @param classNode ClassNode which needs to be populated with public setter
* @param fieldName Name of the field for which setter needs to be added
* @param fieldNameForMethods Suffix for setter method. Prefix "set" is added by this method
* @param fieldJavaType Java ASM type of the field
*/
@SuppressWarnings("unchecked")
private static void addSetter(ClassNode classNode, String fieldName, String fieldNameForMethods, String fieldJavaType) {
String setterSignature = '(' + fieldJavaType + ')' + 'V';
MethodNode setterNode = new MethodNode(Opcodes.ACC_PUBLIC, "set" + fieldNameForMethods, setterSignature, null, null);
setterNode.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
int loadOpCode;
if (fieldJavaType.equals(Character.toString(typeIdentifierBoolean)) || fieldJavaType.equals(Character.toString(typeIdentifierByte)) || fieldJavaType.equals(Character.toString(typeIdentifierChar)) || fieldJavaType.equals(Character.toString(typeIdentifierShort)) || fieldJavaType.equals(Character.toString(typeIdentifierInt))) {
loadOpCode = Opcodes.ILOAD;
} else if (fieldJavaType.equals(Character.toString(typeIdentifierLong))) {
loadOpCode = Opcodes.LLOAD;
} else if (fieldJavaType.equals(Character.toString(typeIdentifierFloat))) {
loadOpCode = Opcodes.FLOAD;
} else if (fieldJavaType.equals(Character.toString(typeIdentifierDouble))) {
loadOpCode = Opcodes.DLOAD;
} else {
loadOpCode = Opcodes.ALOAD;
}
setterNode.instructions.add(new VarInsnNode(loadOpCode, 1));
setterNode.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, classNode.name, fieldName, fieldJavaType));
setterNode.instructions.add(new InsnNode(Opcodes.RETURN));
classNode.methods.add(setterNode);
}
use of org.apache.xbean.asm5.Type in project apex-malhar by apache.
the class BeanClassGenerator method addDateFields.
/**
* Date field is explicitly handled and provided with 3 variants of types of same data.
* 1. java.util.Date format
* 2. long - Epoc time in ms
* 3. int - Epoc time in sec rounded to date
*
* This is purposefully done because SQL operations on Date etc happens on long or int based on whether its a SQL DATE
* field OR SQL TIMESTAMP field. Hence to cater to that 2 more variant of the same data is added to the POJO.
*/
@SuppressWarnings("unchecked")
private static void addDateFields(ClassNode classNode, String fieldName, String fieldNameForMethods, String type) {
FieldNode fieldNodeSec = new FieldNode(Opcodes.ACC_PRIVATE, fieldName + "Sec", getJavaType("java.lang.Integer"), null, null);
classNode.fields.add(fieldNodeSec);
FieldNode fieldNodeMs = new FieldNode(Opcodes.ACC_PRIVATE, fieldName + "Ms", getJavaType("java.lang.Long"), null, null);
classNode.fields.add(fieldNodeMs);
// Create getter for Date
MethodNode getterNodeDate = new MethodNode(Opcodes.ACC_PUBLIC, "get" + fieldNameForMethods, "()L" + type + ";", null, null);
getterNodeDate.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
getterNodeDate.instructions.add(new FieldInsnNode(Opcodes.GETFIELD, classNode.name, fieldName, "L" + type + ";"));
getterNodeDate.instructions.add(new InsnNode(Opcodes.ARETURN));
classNode.methods.add(getterNodeDate);
// Create getter for Sec
MethodNode getterNodeSec = new MethodNode(Opcodes.ACC_PUBLIC, "get" + fieldNameForMethods + "Sec", "()Ljava/lang/Integer;", null, null);
getterNodeSec.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
getterNodeSec.instructions.add(new FieldInsnNode(Opcodes.GETFIELD, classNode.name, fieldName + "Sec", "Ljava/lang/Integer;"));
getterNodeSec.instructions.add(new InsnNode(Opcodes.ARETURN));
classNode.methods.add(getterNodeSec);
// Create getter for Ms
MethodNode getterNodeMs = new MethodNode(Opcodes.ACC_PUBLIC, "get" + fieldNameForMethods + "Ms", "()Ljava/lang/Long;", null, null);
getterNodeMs.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
getterNodeMs.instructions.add(new FieldInsnNode(Opcodes.GETFIELD, classNode.name, fieldName + "Ms", "Ljava/lang/Long;"));
getterNodeMs.instructions.add(new InsnNode(Opcodes.ARETURN));
classNode.methods.add(getterNodeMs);
// Create setter for Date
MethodNode setterNodeDate = new MethodNode(Opcodes.ACC_PUBLIC, "set" + fieldNameForMethods, "(L" + type + ";)V", null, null);
setterNodeDate.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
setterNodeDate.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));
setterNodeDate.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, classNode.name, fieldName, "L" + type + ";"));
setterNodeDate.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
setterNodeDate.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));
setterNodeDate.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, type, "getTime", "()J", false));
setterNodeDate.instructions.add(new LdcInsnNode(new Long(1000)));
setterNodeDate.instructions.add(new InsnNode(Opcodes.LDIV));
setterNodeDate.instructions.add(new InsnNode(Opcodes.L2I));
setterNodeDate.instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false));
setterNodeDate.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, classNode.name, fieldName + "Sec", "Ljava/lang/Integer;"));
setterNodeDate.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
setterNodeDate.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));
setterNodeDate.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, type, "getTime", "()J", false));
setterNodeDate.instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;", false));
setterNodeDate.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, classNode.name, fieldName + "Ms", "Ljava/lang/Long;"));
setterNodeDate.instructions.add(new InsnNode(Opcodes.RETURN));
classNode.methods.add(setterNodeDate);
// Create setter for Sec
MethodNode setterNodeSec = new MethodNode(Opcodes.ACC_PUBLIC, "set" + fieldNameForMethods + "Sec", "(Ljava/lang/Integer;)V", null, null);
setterNodeSec.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
setterNodeSec.instructions.add(new TypeInsnNode(Opcodes.NEW, type));
setterNodeSec.instructions.add(new InsnNode(Opcodes.DUP));
setterNodeSec.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));
setterNodeSec.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I", false));
setterNodeSec.instructions.add(new InsnNode(Opcodes.I2L));
setterNodeSec.instructions.add(new LdcInsnNode(new Long(1000)));
setterNodeSec.instructions.add(new InsnNode(Opcodes.LMUL));
setterNodeSec.instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "java/util/Date", "<init>", "(J)V", false));
setterNodeSec.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, classNode.name, fieldName, "L" + type + ";"));
setterNodeSec.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
setterNodeSec.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));
setterNodeSec.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, classNode.name, fieldName + "Sec", "Ljava/lang/Integer;"));
setterNodeSec.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
setterNodeSec.instructions.add(new TypeInsnNode(Opcodes.NEW, "java/lang/Long"));
setterNodeSec.instructions.add(new InsnNode(Opcodes.DUP));
setterNodeSec.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));
setterNodeSec.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I", false));
setterNodeSec.instructions.add(new InsnNode(Opcodes.I2L));
setterNodeSec.instructions.add(new LdcInsnNode(new Long(1000)));
setterNodeSec.instructions.add(new InsnNode(Opcodes.LMUL));
setterNodeSec.instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "java/lang/Long", "<init>", "(J)V", false));
setterNodeSec.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, classNode.name, fieldName + "Ms", "Ljava/lang/Long;"));
setterNodeSec.instructions.add(new InsnNode(Opcodes.RETURN));
classNode.methods.add(setterNodeSec);
// Create setter for Ms
MethodNode setterNodeMs = new MethodNode(Opcodes.ACC_PUBLIC, "set" + fieldNameForMethods + "Ms", "(Ljava/lang/Long;)V", null, null);
setterNodeMs.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
setterNodeMs.instructions.add(new TypeInsnNode(Opcodes.NEW, type));
setterNodeMs.instructions.add(new InsnNode(Opcodes.DUP));
setterNodeMs.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));
setterNodeMs.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/lang/Long", "longValue", "()J", false));
setterNodeMs.instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "java/util/Date", "<init>", "(J)V", false));
setterNodeMs.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, classNode.name, fieldName, "L" + type + ";"));
setterNodeMs.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
setterNodeMs.instructions.add(new TypeInsnNode(Opcodes.NEW, "java/lang/Integer"));
setterNodeMs.instructions.add(new InsnNode(Opcodes.DUP));
setterNodeMs.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));
setterNodeMs.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/lang/Long", "longValue", "()J", false));
setterNodeMs.instructions.add(new LdcInsnNode(new Long(1000)));
setterNodeMs.instructions.add(new InsnNode(Opcodes.LDIV));
setterNodeMs.instructions.add(new InsnNode(Opcodes.L2I));
setterNodeMs.instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "java/lang/Integer", "<init>", "(I)V", false));
setterNodeMs.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, classNode.name, fieldName + "Sec", "Ljava/lang/Integer;"));
setterNodeMs.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
setterNodeMs.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));
setterNodeMs.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, classNode.name, fieldName + "Ms", "Ljava/lang/Long;"));
setterNodeMs.instructions.add(new InsnNode(Opcodes.RETURN));
classNode.methods.add(setterNodeMs);
}
use of org.apache.xbean.asm5.Type in project apex-malhar by apache.
the class BeanClassGenerator method addGetter.
/**
* Add public getter method for given field
* @param classNode ClassNode which needs to be populated with public getter.
* @param fieldName Name of the field for which public getter needs to be added.
* @param fieldNameForMethods Suffix of the getter method, Prefix "is" or "get" is added by this method.
* @param fieldJavaType Java ASM type of the field
*/
@SuppressWarnings("unchecked")
private static void addGetter(ClassNode classNode, String fieldName, String fieldNameForMethods, String fieldJavaType) {
String getterSignature = "()" + fieldJavaType;
MethodNode getterNode = new MethodNode(Opcodes.ACC_PUBLIC, (fieldJavaType.equals(typeIdentifierBoolean) ? "is" : "get") + fieldNameForMethods, getterSignature, null, null);
getterNode.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
getterNode.instructions.add(new FieldInsnNode(Opcodes.GETFIELD, classNode.name, fieldName, fieldJavaType));
int returnOpCode;
if (fieldJavaType.equals(Character.toString(typeIdentifierBoolean)) || fieldJavaType.equals(Character.toString(typeIdentifierByte)) || fieldJavaType.equals(Character.toString(typeIdentifierChar)) || fieldJavaType.equals(Character.toString(typeIdentifierShort)) || fieldJavaType.equals(Character.toString(typeIdentifierInt))) {
returnOpCode = Opcodes.IRETURN;
} else if (fieldJavaType.equals(Character.toString(typeIdentifierLong))) {
returnOpCode = Opcodes.LRETURN;
} else if (fieldJavaType.equals(Character.toString(typeIdentifierFloat))) {
returnOpCode = Opcodes.FRETURN;
} else if (fieldJavaType.equals(Character.toString(typeIdentifierDouble))) {
returnOpCode = Opcodes.DRETURN;
} else {
returnOpCode = Opcodes.ARETURN;
}
getterNode.instructions.add(new InsnNode(returnOpCode));
classNode.methods.add(getterNode);
}
use of org.apache.xbean.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