use of javassist.bytecode.MethodInfo in project hibernate-orm by hibernate.
the class BulkAccessorFactory method addDefaultConstructor.
/**
* Declares a constructor that takes no parameter.
*
* @param classfile The class descriptor
*
* @throws CannotCompileException Indicates trouble with the underlying Javassist calls
*/
private void addDefaultConstructor(ClassFile classfile) throws CannotCompileException {
final ConstPool constPool = classfile.getConstPool();
final String constructorSignature = "()V";
final MethodInfo constructorMethodInfo = new MethodInfo(constPool, MethodInfo.nameInit, constructorSignature);
final Bytecode code = new Bytecode(constPool, 0, 1);
// aload_0
code.addAload(0);
// invokespecial
code.addInvokespecial(BulkAccessor.class.getName(), MethodInfo.nameInit, constructorSignature);
// return
code.addOpcode(Opcode.RETURN);
constructorMethodInfo.setCodeAttribute(code.toCodeAttribute());
constructorMethodInfo.setAccessFlags(AccessFlag.PUBLIC);
classfile.addMethod(constructorMethodInfo);
}
use of javassist.bytecode.MethodInfo in project reflections by ronmamo.
the class MethodParameterNamesScanner method scan.
@Override
public void scan(Object cls) {
final MetadataAdapter md = getMetadataAdapter();
for (Object method : md.getMethods(cls)) {
String key = md.getMethodFullKey(cls, method);
if (acceptResult(key)) {
LocalVariableAttribute table = (LocalVariableAttribute) ((MethodInfo) method).getCodeAttribute().getAttribute(LocalVariableAttribute.tag);
int length = table.tableLength();
//skip this
int i = Modifier.isStatic(((MethodInfo) method).getAccessFlags()) ? 0 : 1;
if (i < length) {
List<String> names = new ArrayList<String>(length - i);
while (i < length) names.add(((MethodInfo) method).getConstPool().getUtf8Info(table.nameIndex(i++)));
getStore().put(key, Joiner.on(", ").join(names));
}
}
}
}
use of javassist.bytecode.MethodInfo in project pinpoint by naver.
the class JavassistClass method hasEnclosingMethod.
@Override
public boolean hasEnclosingMethod(String methodName, String... parameterTypes) {
CtBehavior behavior;
try {
behavior = ctClass.getEnclosingBehavior();
} catch (NotFoundException ignored) {
return false;
}
if (behavior == null) {
return false;
}
final MethodInfo methodInfo = behavior.getMethodInfo2();
if (!methodInfo.getName().equals(methodName)) {
return false;
}
final String jvmSignature = JavaAssistUtils.javaTypeToJvmSignature(parameterTypes);
if (methodInfo.getDescriptor().startsWith(jvmSignature)) {
return true;
}
return false;
}
use of javassist.bytecode.MethodInfo in project pinpoint by naver.
the class JavassistEngineTest method getTransformByteCode.
public byte[] getTransformByteCode() {
try {
final ClassPool pool = new ClassPool(true);
final CtClass ctClass = pool.get(mock);
final ConstPool constPool = ctClass.getClassFile2().getConstPool();
MethodInfo info = new MethodInfo(constPool, "transformMethod", "()V");
final CtMethod newMethod = CtMethod.make(info, ctClass);
ctClass.addMethod(newMethod);
return ctClass.toBytecode();
} catch (Exception ex) {
throw new RuntimeException(ex.getMessage(), ex);
}
}
use of javassist.bytecode.MethodInfo in project yyl_example by Relucent.
the class GetMethodParamNameTest method getMethodParamNames.
/**
* 获得参数名 (JDK 自带类 ,接口方法和抽象方法无法正确获取参数名)
*/
private static String[] getMethodParamNames(final Method method) throws NotFoundException {
final String methodName = method.getName();
final Class<?>[] methodParameterTypes = method.getParameterTypes();
final int methodParameterCount = methodParameterTypes.length;
final String className = method.getDeclaringClass().getName();
final boolean isStatic = Modifier.isStatic(method.getModifiers());
final String[] methodParametersNames = new String[methodParameterCount];
ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.get(className);
CtClass[] ctTypes = new CtClass[methodParameterTypes.length];
for (int i = 0; i < methodParameterCount; i++) {
ctTypes[i] = pool.get(methodParameterTypes[i].getName());
}
CtMethod ctMethod = ctClass.getDeclaredMethod(methodName, ctTypes);
MethodInfo methodInfo = ctMethod.getMethodInfo();
CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
LocalVariableAttribute attribute = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);
//如果是静态方法,第一个参数就是方法参数,非静态方法,则第一个参数是 this ,然后才是方法的参数
if (attribute != null) {
int variableCount = isStatic ? methodParameterCount : methodParameterCount + 1;
for (int index = 0; index < variableCount; index++) {
int methodParameterIndex = isStatic ? index : index - 1;
if (0 <= methodParameterIndex && methodParameterIndex < methodParameterCount) {
methodParametersNames[methodParameterIndex] = attribute.variableName(index);
}
}
}
return methodParametersNames;
}
Aggregations