public static byte[] generateMethodArgsUpdater(Class<?> classToProxy, Method method, int methodId) throws Exception {
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
String classToProxyDescriptor = Type.getDescriptor(classToProxy);
String classToProxyInternalName = Type.getInternalName(classToProxy);
String suffix = SUFFIX_START + method.getName() + methodId;
String selfClassInternalName = classToProxyInternalName + suffix;
String selfClassDescriptor = BytecodeGenUtils.makeSuffixClassDescriptor(classToProxyDescriptor, suffix);
String argsClassInternalName = classToProxyInternalName + MethodArgumentsGenerator.SUFFIX_START + method.getName() + methodId;
String constDesc = Type.getMethodDescriptor(Type.VOID_TYPE,
Stream.concat(Stream.of(List.class), Stream.of(method.getParameterTypes())).map(Type::getType)
.toArray(Type[]::new));
cw.visit(52, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, selfClassInternalName, null, "java/lang/Object",
new String[] { "io/primeval/reflex/arguments/ArgumentsUpdater" });
Parameter[] parameters = method.getParameters();
generateFields(method, cw, parameters);
generateConstructor(method, cw, selfClassInternalName, selfClassDescriptor, constDesc, parameters);
generateHashCodeMethod(cw, selfClassInternalName, selfClassDescriptor, parameters);
generateEqualsMethod(cw, selfClassInternalName, selfClassDescriptor, parameters);
generateToStringMethod(cw, selfClassInternalName, selfClassDescriptor, parameters);
generateUpdateMethod(cw, selfClassInternalName, selfClassDescriptor, argsClassInternalName, constDesc, parameters);
generateParametersGetter(cw, selfClassInternalName, selfClassDescriptor);
generateArgumentSetters(cw, selfClassInternalName, selfClassDescriptor, parameters);
generateArgumentGetters(cw, selfClassInternalName, selfClassDescriptor, parameters);
cw.visitEnd();
return cw.toByteArray();
}
MethodArgumentssUpdaterGenerator.java 文件源码
java
阅读 32
收藏 0
点赞 0
评论 0
项目:primeval-reflex
作者:
评论列表
文章目录