[关闭]
@yulongsun 2018-04-19T15:58:52.000000Z 字数 2202 阅读 847

Spring源码走读- 动态代理技术

Spring源码走读


ASM库

  1. public class AsmTest {
  2. @Test
  3. public void testCreateClass() {
  4. ClassWriter classWriter = new ClassWriter(0);
  5. // 创建类
  6. classWriter.visit(Opcodes.V1_8, //java版本
  7. Opcodes.ACC_PUBLIC, // 类的访问权限
  8. "AsmClazz", //类名
  9. null,
  10. "java/lang/Object",
  11. null);
  12. // 创建构造函数
  13. MethodVisitor constructMethod = classWriter.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
  14. constructMethod.visitCode();
  15. constructMethod.visitVarInsn(Opcodes.ALOAD, 0);
  16. constructMethod.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Object", "<init>", "()V");
  17. constructMethod.visitInsn(Opcodes.RETURN);
  18. constructMethod.visitMaxs(1, 1);
  19. constructMethod.visitEnd();
  20. // 创建code
  21. MethodVisitor visitMethod = classWriter.visitMethod(Opcodes.ACC_PUBLIC, "say", "()V", null, null);
  22. visitMethod.visitCode();
  23. visitMethod.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream");
  24. visitMethod.visitLdcInsn("I'm a asm class .");
  25. visitMethod.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
  26. visitMethod.visitInsn(Opcodes.RETURN);
  27. visitMethod.visitMaxs(2, 2);
  28. visitMethod.visitEnd();
  29. //
  30. //输出到文件
  31. try {
  32. FileOutputStream fileOutputStream = new FileOutputStream(new File("AsmCode.class"));
  33. fileOutputStream.write(classWriter.toByteArray());
  34. fileOutputStream.close();
  35. } catch (FileNotFoundException e) {
  36. e.printStackTrace();
  37. } catch (IOException e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. }

生成代码如下:

  1. public class AsmClazz {
  2. public AsmClazz() {
  3. }
  4. public void say() {
  5. System.out.println("I'm a asm class .");
  6. }
  7. }

Javassist

  1. public class JavassistTest {
  2. @Test
  3. public void testCreateClass() throws CannotCompileException, NotFoundException, IOException {
  4. ClassPool classPool = ClassPool.getDefault();
  5. //定义类
  6. CtClass ctClass = classPool.makeClass("JavassistClazz");
  7. //定义code方法
  8. CtMethod ctMethod = CtNewMethod.make("public void say(){}", ctClass);
  9. //插入方法代码
  10. ctMethod.insertBefore("System.out.println(\"I'm Javassist Class\");");
  11. ctClass.addMethod(ctMethod);
  12. //
  13. ctClass.writeFile();
  14. System.out.println("代码生成结束");
  15. }
  16. }

生成代码如下:

  1. public class JavassistClazz {
  2. public void say() {
  3. System.out.println("I'm Javassist Class");
  4. }
  5. public JavassistClazz() {
  6. }
  7. }

动态代理

JDK动态代理

CGLIB动态代理

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注