}
}
protected static synchronized Class<?> create(Class<?> classZ) {
String myName = classZ.getName().replace('.', '/') + FastClass.CLASSNAME + count.getAndIncrement();
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
cw.visit(V1_6,
ACC_PUBLIC,
myName,
null,
"org/nutz/lang/reflect/AbstractFastClass",
null);
// 添加默认构造方法
{
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC,
"<init>",
"()V",
null,
null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL,
"org/nutz/lang/reflect/AbstractFastClass",
"<init>",
"()V");
mv.visitInsn(RETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();
}
// 添加默认字段
{
cw.visitField(ACC_PUBLIC + ACC_STATIC,
FastClassFactory.MethodArray_FieldName,
"[Ljava/lang/reflect/Method;",
null,
null).visitEnd();
cw.visitField(ACC_PUBLIC + ACC_STATIC,
ConstructorArray_FieldName,
"[Ljava/lang/reflect/Constructor;",
null,
null).visitEnd();
cw.visitField(ACC_PUBLIC + ACC_STATIC,
SrcClass_FieldName,
"Ljava/lang/Class;",
"Ljava/lang/Class<*>;",
null).visitEnd();
}
// 实现默认字段的getter
{
MethodVisitor mv = cw.visitMethod(ACC_PROTECTED,
"getMethods",
"()[Ljava/lang/reflect/Method;",
null,
null);
mv.visitCode();
mv.visitFieldInsn(GETSTATIC,
myName,
FastClassFactory.MethodArray_FieldName,
"[Ljava/lang/reflect/Method;");
mv.visitInsn(ARETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();
// -----------------------------------------------------------------------------------------------------
mv = cw.visitMethod(ACC_PROTECTED,
"getConstructors",
"()[Ljava/lang/reflect/Constructor;",
"()[Ljava/lang/reflect/Constructor<*>;",
null);
mv.visitCode();
mv.visitFieldInsn(GETSTATIC,
myName,
ConstructorArray_FieldName,
"[Ljava/lang/reflect/Constructor;");
mv.visitInsn(ARETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();
// -----------------------------------------------------------------------------------------------------
mv = cw.visitMethod(ACC_PROTECTED,
"getSrcClass",
"()Ljava/lang/Class;",
"()Ljava/lang/Class<*>;",
null);
mv.visitCode();
mv.visitFieldInsn(GETSTATIC,
myName,
SrcClass_FieldName,
"Ljava/lang/Class;");
mv.visitInsn(ARETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();
}
Method[] methods = classZ.getMethods();
Arrays.sort(methods, new MethodComparator());
// 构建_invoke方法
{
String[] methodNames = new String[methods.length];
String[] descs = new String[methods.length];
int[] modifies = new int[methods.length];
int[] invokeOps = new int[methods.length];
for (int i = 0; i < methods.length; i++) {
methodNames[i] = methods[i].getName();
descs[i] = Type.getMethodDescriptor(methods[i]);
modifies[i] = methods[i].getModifiers();
if (classZ.isInterface())
invokeOps[i] = INVOKEINTERFACE;
else if (Modifier.isAbstract(methods[i].getModifiers()))
invokeOps[i] = INVOKESPECIAL;
else if (Modifier.isStatic(methods[i].getModifiers()))
invokeOps[i] = INVOKESTATIC;
else
invokeOps[i] = INVOKEVIRTUAL;
}
FastClassAdpter.createInokeMethod(cw.visitMethod(ACC_PUBLIC
+ ACC_VARARGS,
"_invoke",
"(Ljava/lang/Object;I[Ljava/lang/Object;)Ljava/lang/Object;",
null,
null),
methodNames,
descs,
modifies,
invokeOps,
classZ.getName()
.replace('.', '/'));
}
// 添加_born方法
Constructor<?>[] constructors = classZ.getConstructors();
Arrays.sort(constructors, new ConstructorComparator());
if (constructors.length > 0) {
FastClassAdpter.createInokeConstructor(cw.visitMethod(ACC_PROTECTED
+ ACC_VARARGS,
"_born",
"(I[Ljava/lang/Object;)Ljava/lang/Object;",
null,
null),
classZ.getName()
.replace('.', '/'),
constructors);
}
cw.visitEnd();
Class<?> xClass = DefaultClassDefiner.def(myName.replace('/', '.'),
cw.toByteArray());
try {
xClass.getField(SrcClass_FieldName).set(null, classZ);
xClass.getField(MethodArray_FieldName).set(null, methods);
xClass.getField(ConstructorArray_FieldName).set(null, constructors);
}