• 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

  • 相关阅读:
    makefile 中 $@ $^ %< 使用
    makefile中的自动化变量$@,$%,$
    linux grep命令
    wc命令
    linux下echo命令
    winscp和putty提取固件教程
    WinSCP和PuTTY在刷openwrt固件的使用教程
    OPENWRT学习笔记入门篇
    第五章 并发性:互斥和同步
    getCurrentSession()和getOpenSession()的区别
  • 原文地址:https://www.cnblogs.com/chuiyuan/p/4787781.html
Copyright © 2020-2023  润新知