1、概述

    1.1  在Java.lang.reflect包下,提供了Proxy类、InvocationHandler接口,使用它们可以生成JDK动态代理类或动态代理对象;

    1.2  【Proxy类】

         1.1.1  Proxy类是所有动态代理类的父类;

         1.1.2  Proxy类提供  用于创建动态代理类、动态代理对象的静态方法;

           1.1.3  在程序中,为   一个或多个接口   动态地生成实现类,可以使用Proxy创建动态代理类;

                  为   一个或多个接口 动态地生成实例,可以使用Proxy创建动态代理对象;

         1.1.4  创建动态代理类、动态代理对象的方法

                a,  public static Class<?> getProxyClass(ClassLoader loader,Class<?>... interfaces)

                        创建一个动态代理类 所对应的Class对象,该代理类将实现interfaces所指定的所有接口;

                        loader:指定生成动态代理类的类加载器;

                b,  public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

                        直接创建一个  动态代理对象,该代理对象的实现类  实现了interfaces指定的所有接口;

                        *****执行代理对象的每个方法时  实际上都是  执行InvocationHandler对象的invoke方法;

2、案例

package com.exiuge.mytest.dongtaidaili;

public interface Person {

    void say(String s);

    void walk();

}
package com.exiuge.mytest.dongtaidaili;

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

public class MyInvokationHandler implements InvocationHandler {

    /**
     * 执行代理对象的方法时,都会被替换成执行下面的invoke方法
     * @param proxy 动态代理对象
     * @param method  正在执行的方法
     * @param args  执行代理对象的方法的传入参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("正在执行的代理对象的方法:"+method);
        if (args!=null){
            System.out.println("正在执行的代理对象的方法的传入参数");
            for (Object o:args) {
                System.out.println(o);
            }
        }else {
            System.out.println("正在执行的代理对象的方法没有传入参数");
        }
        return null;
    }
}
package com.exiuge.mytest.dongtaidaili;

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

public class Test {

    public static void main(String[] args){
        //创建自定义的InvocationHandler
        InvocationHandler invocationHandler=new MyInvokationHandler();
        //生成指定接口的动态代理对象
        Person person=(Person)Proxy.newProxyInstance(Person.class.getClassLoader(),new Class[]{Person.class},invocationHandler);
        person.say("hello");
        person.walk();
    }
}

执行结果:

                        

                        

JavaSE---使用反射生成JDK动态代理的更多相关文章

  1. 利用反射生成JDK动态代理

    利用反射生成JDK动态代理 在Java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口可以生成JDK动态代理类和动态代理 ...

  2. Java基础之反射生成JDK动态代理

    在Java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口.通过这个类和接口可以生成JDK动态代理类或动态代理对象. JDK动态代理例子: / ...

  3. MyBatis之反射技术+JDK动态代理+cglib代理

    一.反射 引用百度百科说明: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功 ...

  4. Java 反射之JDK动态代理

    Proxy提供用于创建动态代理类和代理对象的静态方法,它也是所有动态代理类的父类.如果我们在程序中为一个或多个接口动态地生成实现类,就可以使用Proxy来创建动态代理类:如果需要为一个或多个接口动态的 ...

  5. MyBATIS插件原理第一篇——技术基础(反射和JDK动态代理)(转)

    在介绍MyBATIS插件原理前我们需要先学习一下一些基础的知识,否则我们是很难理解MyBATIS的运行原理和插件原理的. MyBATIS最主要的是反射和动态代理技术,让我们首先先熟悉它们. 1:Jav ...

  6. 静态代理和利用反射形成的动态代理(JDK动态代理)

    代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 静态代理 1.新建 ...

  7. JDK动态代理[4]----ProxyGenerator生成代理类的字节码文件解析

    通过前面几篇的分析,我们知道代理类是通过Proxy类的ProxyClassFactory工厂生成的,这个工厂类会去调用ProxyGenerator类的generateProxyClass()方法来生成 ...

  8. 深挖JDK动态代理(二):JDK动态生成后的字节码分析

    接上一篇文章深挖JDK动态代理(一)我们来分析一下JDK生成动态的代理类究竟是个什么东西 1. 将生成的代理类编程一个class文件,通过以下方法 public static void transCl ...

  9. JAVA-获取 JDK 动态代理生成的 Class 文件

    可指定路径 import sun.misc.ProxyGenerator; import java.io.FileOutputStream; import java.io.IOException; i ...

随机推荐

  1. Luogu 3479 [POI2009]GAS-Fire Extinguishers

    补上了这一道原题,感觉弱化版的要简单好多. 神贪心: 我们设$cov_{x, i}$表示在$x$的子树中与$x$距离为$i$的还没有被覆盖到的结点个数,设$rem_{x, i}$表示在$x$的子树中与 ...

  2. apache的Base64编解码

    import org.apache.commons.codec.binary.Base64;  String Base64.encodeBase64URLSafeString(byte[]) byte ...

  3. 树莓派研究笔记(6)-- Lakka模拟游戏机

    我发现lakka的支持的游戏平台特别多,包括国产的OrangePI,真是太棒了.我们可以用这个来打造一个全功能模拟器平台.(删除线部分为Orange PI 测试成功内容,但在树莓派上无需那些操作) 访 ...

  4. 前端(HTML/CSS/JS)-JavaScript编码规范

    1. 变量命名 (1)变量名不应以短巧为荣 左边的变量名都不太清楚,代码的扩展性不好,一旦代码需要加功能的话,就容易出现obj1.obj2.obj3这种很抽象的命名方式.所以一开始就要把变量的名字起得 ...

  5. 远程桌面--------ms12-020 漏洞复现 (死亡蓝屏)

    漏洞名:MS12-020(全称:Microsoft windows远程桌面协议RDP远程代码执行漏洞) 介绍:RDP协议是一个多通道的协议,让用户连上提供微软终端机服务的电脑. windows在处理某 ...

  6. Android将程序崩溃信息保存本地文件

    大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了 ...

  7. git命令(一)

    git中每个版本的保存是记录每个版本的快照,只在乎这个文件是否改变. Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 ...

  8. 2013年第四届蓝桥杯国赛 九宫重排(HashMap+双BFS优化)

    九宫重排     时间限制:1.0s   内存限制:256.0MB 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干 ...

  9. day01.1-计算机体系与数据描述

    一.   指令执行过程                                 二.   计算机体系架构                                其中,ROM所存数据较为 ...

  10. 【bzoj2434】: [Noi2011]阿狸的打字机 字符串-AC自动机-BIT

    [bzoj2434]: [Noi2011]阿狸的打字机 x串在y串上的匹配次数就是y在自动机所有节点上能够通过fail走到x最后一个节点的个数 (就是y串任意一个前缀的后缀能匹配到x的个数)和[bzo ...