动态代理入门演示

1 接口代码

package www.test.proxy;

public interface  TargetInterface {

	public void method1();
	public String method2();
	public int method3(int x);
}

2 实现接口类的代码

package www.test.proxy;

public class Target implements TargetInterface {

    @Override
    public void method1() {
        System.out.println("method1 running..........");
    }

    @Override
    public String method2() {
        System.out.println("method2 running...........");
        return "method2";
    }

    @Override
    public int method3(int x) {

        return x ;
    }

}

3 动态代理代码演示1

package www.test.proxy;

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

import org.junit.Test;

public class ProxyTest {
    @Test
    public void test1(){
        //获得动态的代理对象----在运行时 在内存中动态的为 Target 创建一个虚拟的代理对象
        //objProxy 是代理对象 根据参数确定到底是谁的代理对象
        TargetInterface objProxy =  (TargetInterface) Proxy.newProxyInstance(
            //loader :与目标对象相同的类加载器
            Target.class.getClassLoader(),
            // interfaces :代表与目标对象实现的所有接口字节码对象数组
            new Class[]{TargetInterface.class},
            //h: 具体的操作,InvocationHandler接口
            new InvocationHandler() {
                //invoke 代表的是执行代理对象的方法
                //method: 代表目标对象的方法字节码对象
                //args:代表目标对象的相应的方法的参数
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    System.out.println("目标方法前的逻辑");
                    //执行目标对象的方法
                    Object invoke = method.invoke(new Target(), args);
                    System.out.println("目标方法后的逻辑");
                    return invoke;
                }
            });
        objProxy.method1();
        String method2 = objProxy.method2();
        System.out.println(method2);
        int method3 = objProxy.method3(18);
        System.out.println(method3);
    }
}

4 动态代理演示代码2

package www.test.proxy;

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

import org.junit.Test;

public class ProxyTest2 {
    @Test
    public void test1(){
        final Target target = new Target();
        //动态创建代理对象
        TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(
                //Proxy.newProxyInstance(loader, interfaces, h)
                //loader: 代表与目标对象相同的类加载器
                target.getClass().getClassLoader(),
                // interfaces :代表与目标对象实现的所有接口字节码对象数组
                target.getClass().getInterfaces(), //返回值为字节码对象数组
                // h : 具体的操作,InvocationHandler接口
                new InvocationHandler() {
                    @Override
                    //被执行几次? ------- 看代理对象调用方法几次
                    //代理对象调用接口相应方法 都是调用 invoke
                    /*
                    * proxy:是代理对象
                    * method:代表的是目标方法的字节码对象
                    * args:代表是调用目标方法时参数
                    */
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //反射知识点
                        Object invoke = method.invoke(target, args);//目标对象的相应方法
                        //retrun 返回的值给代理对象
                        return invoke;
                    }
                });
        //调用 invoke---Method: 目标对象的 method1 方法 args: null 返回值 null
        proxy.method1();
        //调用 invoke---Method:目标对象的 method2 方法 args:null 返回值 method2
        String method2 = proxy.method2();
        //调用 invoke-----Method:目标对象的 method3 方法 args:Object[]{100} 返回值 100
        int method3 = proxy.method3(100);
        System.out.println(method2);
        System.out.println(method3);

    }
}

原文地址:https://www.cnblogs.com/jepson6669/p/8438044.html

时间: 2025-01-17 19:21:09

动态代理入门演示的相关文章

动态代理入门(jdk)

动态代理就是aop的核心,动态代理简单的就是通过创建一个代理对象,然后把原来的方法增强.很抽象,例子是王道.jdk中提供了动态代理的实现,但是它是针对接口,如果要实现动态代理,需要被代理对象的接口.这是它的缺点,不能为了实现动态代理,都要给被代理对象写个接口,在web开发中有时很麻烦,这样就出现了通过直接改变字节码,写个子类重写需要增强的方法,但是如果这个类中的方法定义为final,它也没办法了. 1.委托类需要实现的接口 1 package 动态代理; 2 3 public interface

AOP与JAVA动态代理

1.AOP的各种实现 AOP就是面向切面编程,我们可以从以下几个层面来实现AOP 在编译期修改源代码 在运行期字节码加载前修改字节码 在运行期字节码加载后动态创建代理类的字节码 2.AOP各种实现机制的比较 以下是各种实现机制的比较: 类别 机制 原理 优点 缺点 静态AOP 静态织入 在编译期,切面直接以字节码的形式编译到目标字节码文件中 对系统无性能影响 灵活性不够 动态AOP 动态代理 在运行期,目标类加载后,为接口动态生成代理类,将切面织入到代理类中 相对于静态AOP更加灵活 切入的关注

关于装饰模式和动态代理模式

装饰模式和动态代理模式乍一看差不多,都是动态的增加行为,其实有各自的区别. 一.首先我们看一下装饰设计模式,其基本思想如下: 1.编写一个类,实现与被装饰类相同的接口.目的使他们有相同的行为 2.定义一个实例变量,引用被装饰对象.目的和原来的老对象进行交接 3.定义构造方法,把被装饰对象注入进来. 4.对于不需要改写的方法,调用被装饰对象的. 5.对于要改写的方法,改写即可. 废话不多说,举一个例子,模拟实现一个数据库连接池,在这里,我想重写close方法,以实现调用close方法之后不是关闭连

MyBatis - Mapper动态代理开发

采用Mapper动态代理方法只需要编写相应的Mapper接口(相当于Dao接口),那么Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同Dao接口实现类方法. - Mapper接口开发需要遵循以下规范: ① Mapper.xml文件中的namespace与mapper接口的全类名相同. ② Mapper接口方法名和Mapper.xml中定义的statement的id相同. ③ Mapper接口方法的输入参数类型和mapper.xml中定义的statement的paramet

Java语言中反射动态代理接口的解释与演示

Java语言中反射动态代理接口的解释与演示 Java在JDK1.3的时候引入了动态代理机制.可以运用在框架编程与平台编程时候捕获事件.审核数据.日志等功能实现,首先看一下设计模式的UML图解: 当你调用一个接口API时候,实际实现类继承该接口,调用时候经过proxy实现. 在Java中动态代理实现的两个关键接口类与class类分别如下: java.lang.reflect.Proxy java.lang.reflect.InvocationHandler 我们下面就通过InvocationHan

java 反射提取类信息, 动态代理 和过滤某些方法演示

package org.rui.classts.reflects; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.regex.Pattern; /** * 提取 类的 方法 构造器 * @author lenovo * */ //{args:ShowMethods} //查看一个类的所有方法和构造器 public class ShowMethods { private

【框架】[Spring] 基于Spring框架的Web应用演示(附带cglib工具进行动态代理)

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 前言: Spring也差不多学了Ioc控制反转和实现AOP技术的两种方式了,分享一个学习Spring,用来入门挺好的例子. 如果你是刚刚学习Spring,那么此实例应该可以很好的帮助你应用Spring到Web项目中. 里面的DAO层-提交数据库的事务我并没有使用Spring 的注解功能,而是用spring的AOP来实现的.这样更灵活,其实,框架为我们做的事越多,我们就越受框架的约束

MySQL---数据库从入门走向大神系列(十)-Connection对象池、装饰模式与动态代理模式

问题概述: 之前本系列博客写的,全部都是一个connection对象,不知道大家发现没有,我们既然做了一个Connection工具类,那么大家肯定都是从那里面拿Connection对象的,之前的如果是多线程运行,很容易出问题的,你想想事务处理就知道了,同时用事务处理操作同一个Connection,肯定会出问题的. 例如: 一方的事务在提交的时候,你正好运行了一个事务中的一个操作,那么你这个操作也会被提交,而且你后面的提交或回滚失效的,如果对方把Connection关闭了,你的程序还会挂. 等等问

mybatis快速入门(八)-spring-mybatis动态代理整合

将上一节的代码改造下就好了,不过这一章会加一个basedaomapper.废话不多说直接上代码了. 创建一个BaseDaoMapper.java package cn.my.sm.mapper; /** * 将公用方法提取出来 * @author Administrator * * @param <T> */ public interface BaseDaoMapper<T> { public T findById(int id); } 为了防止和上个UserDao有冲突,我们创建