java字节码生成与动态代理的实现

一、代码生成的例子

  java中的javac命令就是字节码生成的“老祖宗”,并且它也是用java写的。还有Web 中的jsp编译器,编译时植入的AOP框架,还有很常用的动态代理,甚至在反射时JVM也有可能在运行时生成字节码来提高速度.

  如果使用过Spring来做Bean的管理 ,那么就使用过动态代理,因为如果 Bean是面向接口的编程,那么在Spring内部都是通过 动态代理的方法来对Bean进行增强的。

二、例子

package com.company;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Created by lsj on 2015/9/6.
 * 动态代理优势:
 * 不在于少写代码,而在于,
 * 在原始类和接口还未知的时候 ,确定代理类的代理行为,也就是让代理类与原始类
 * 脱离了直接联系
 */
public class DynamicProxyTest {
    interface  IHello {
        void sayHello() ;
    }

    static  class Hello implements  IHello{
        @Override
        public void sayHello() {
            System.out.println("hello world");
        }
    }

    static class DynamicProxy implements InvocationHandler{

        Object oriObj ;

        Object bind(Object oriObj){
            this.oriObj = oriObj ;
            return Proxy.newProxyInstance(oriObj.getClass().getClassLoader(),
                    oriObj.getClass().getInterfaces(), this) ;
        }
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("welcome ");
            return  method.invoke(oriObj, args) ;
            //return null;
        }
    }
    public static void main(String [] args){
        /**
         * 返回了一个实现了IHello接口并代理了new Hello()实例行为的对象,进行了验证,优化等
         * 生成了字节码,并进行了类的显式加载
         */
        IHello hello = (IHello)new DynamicProxy().bind(new Hello());
        hello.sayHello();
    }
}

 结果 :

welcome

hello world

时间: 2024-11-09 16:01:59

java字节码生成与动态代理的实现的相关文章

字节码技术及动态代理

.output_wrapper pre code { font-family: Consolas, Inconsolata, Courier, monospace; display: block !important; white-space: pre !important; overflow: auto !important } .task-list-list { list-style-type: none } .task-list-list.checked { color: rgb(62,

Java字节码操作开源框架简介

avassist  Javassist是一个开源的分析.编辑和创建Java字节码的类库.是由东京技术学院的数学和计算机科学系的 Shigeru Chiba 所创建的.它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架. BCEL  Byte Code Engineering Library (BCEL),这是Apache Software Foundation 的Jakarta 项目的一部分.BCEL是 Java classwor

javaAgent和Java字节码增强技术的学习与实践

参考文章: https://www.cnblogs.com/chiangchou/p/javassist.html https://blog.csdn.net/u010039929/article/details/62881743 https://www.jianshu.com/p/0f64779cdcea [本文代码下载] 下载代码 [背景] 最近在工作中进行程序的性能调优时,想起之前同事的介绍的阿里的Java在线诊断工具 —— arthas,决定试用一下. 这玩意,是真的好用,能在对被检测程

Java反射—运用反射生成jdk动态代理

1.  核心类&接口 在Java的java.lang.reflect包下提供一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口可以生成jdk动态代理类或动态代理对象. Proxy是所有动态代理类的父类,它提供了两个静态方法来创建动态代理类和动态代理对象,如下: ?  static Class<?> getProxyClass(ClassLoader loader, Class<?>... interfaces) ?  static Objec

关于java字节码框架ASM的学习

一.什么是ASM ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能.ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为.Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称.方法.属性以及 Java 字节码(指令).ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类.asm字节码增强技术主要是用来反射的时候提升性能的,

Java字节码 小结

Reference javap 基本使用方法 深入理解java字节码 从Java代码到字节码 Java字节码.class文件案例分析 字节码 核心概念 Class文件是8位字节流,按字节对齐.之所以称为字节码,是由于每条指令都仅仅占领一个字节.全部的操作码和操作数都是按字节对齐的. 数据结构 Java虚拟机规范中规定.Class文件格式採用一种相似C语言结构体的伪结构来存储,它仅仅有两种数据类型 无符号数(基本数据类型) 主要用于描写叙述数字.索引引用.数量值.或UTF-8编码构成的字符串: u

Java的反射机制和动态代理

介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大的功能,可以原生实现AOP中 的方法拦截功能.正如英文单词reflection的含义一样,使用反射API的时候就好像在看一个Java类在水中的倒影一样.知道了Java类的内部 结构之后,就可以与它进行交互,包括创建新的对象和调用对象中的方法等.这种交互方式与直接在源代码中使用的效果是相同的,但是又额外提供了运行时

第五篇 java字节码操作

java动态性的两种常见的实现方式: ①字节码操作 ②反射 运行时操作字节码可以让我们实现如下功能: ①动态生成新的类 ②动态改变某个类的结构(添加.删除.修改  新的属性或方法) 优点: 比反射的开销小,性能高 Javassist性能高于反射,低于ASM BCEL(Byte Code Engineering Library): 是java classworking 广泛使用的一种框架,它可以让你深入JVM汇编语言进行类操作的细节.BCEL与Javassist有不同的处理字节码的方法,BCEL在

这一次,彻底弄懂「Java字节码文件」

提前祝福各位读者??圣诞快乐!这个圣诞节请在学习中度过! 不啰嗦,直接从最最简单的一段Java源代码开启Java整体字节码分析之旅. 1.Java 源码文件 package com.dskj.jvm.bytecode; public class MyTest1 { private int a = 1; public int getA() { return a; } public void setA(int a) { this.a = a; } } 2.Java字节码文件 IDEA工具编译代码后,