一、什么叫jdk的代理?
用另外一个对象去代理实际对象的操作
分为动态代理和静态代理

二、先说说静态代理
从字面意思来看就是不会改变的,只可以代理某个固定对象的。
静态代理就是通过实现和目标对象实现的同一个接口来代理目标对象。
通俗一点:例如A类实现了B接口,这时候我们要代理A类,我们需要声明一个C类也实现B接口,从而达到代理A类的目的;这个时候我们操作A类的方法时,可以通过操作C类来实现。
  

  看代码:
    1、写一个接口
 
public interface MyTest02 {

    void test01(String a);
}

    2、写一个类实现这个接口

public class MyTest03 implements MyTest02 {
@Override
public void test01(String a) {
System.out.println(123);
}
}

    3、写一个类来代理

public class MyTest04  implements MyTest02{

    private MyTest03 myTest03;

    public  MyTest04(MyTest03 myTest03){
this.myTest03=myTest03;
} @Override
public void test01(String a) {
System.out.println("处理前");
myTest03.test01(a);
System.out.println("处理后");
}
}

    4、编写测试类

public class MainTest {

    public static void main(String[] args) {
MyTest03 myTest03 = new MyTest03();
/* MyTest01 test01 = new MyTest01(myTest03);
MyTest02 subject = (MyTest02) Proxy.newProxyInstance(MyTest03.class.getClassLoader(), MyTest03.class.getInterfaces(), test01);
subject.test01("456");*/ MyTest04 test04 = new MyTest04(myTest03);
test04.test01("");
}
}

    5、运行结果

    6、静态代理总结:

      可以在不操作原对象的同时添加前置方法和后置方法,不需要操作原对象的同时更改逻辑,这也是唯一的优点哈,可以说是没有优点!因为需要代理一个类时就需要写一个实现类,一般都是用接下来要说的动态代理!

三、动态代理
静态代理可以实现的功能,动态代理都可以实现!动态代理的实现是在运行时,根据一组接口定义,使用Proxy、InvocationHandler等工具类去生成一个代理类和代理类实例。
相比于静态代理来说,动态代理需要代理一个类的时候不需要额外写一个实现类;大部分的工作都是Proxy工具类帮我们完成的。
  
  看代码:
    1、基于上面的代码,写一个类实现InvocationHandler
    
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyTest01 implements InvocationHandler { private Object subject; /**
* 构造方法,给我们要代理的真实对象赋初值
*
* @param subject
*/
public MyTest01(Object subject) {
this.subject = subject;
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//在代理真实对象前我们可以添加一些自己的操作
System.out.println("在调用之前,我要干点啥呢?"); System.out.println("Method:" + method); //当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用
Object returnValue = method.invoke(subject, args); //在代理真实对象后我们也可以添加一些自己的操作
System.out.println("在调用之后,我要干点啥呢?"); return returnValue; }
}

   2、测试类;例如我要代理String这个类从接口CharSequence实现过来的.length()方法



import java.lang.reflect.Proxy;

public class MainTest {

public static void main(String[] args) {
String myTest03 = new String("123");
MyTest01 test01 = new MyTest01(myTest03);
CharSequence subject = (CharSequence) Proxy.newProxyInstance(String.class.getClassLoader(), String.class.getInterfaces(), test01);
System.out.println(subject.length());
}
}
 

    3、运行结果

    

    4、动态代理总结:

      要使用jdk的代理功能的话,一般都是使用的动态代理,动态代理和静态代理都需要实现接口才可以进行代理;主要用于添加目标方法逻辑时,又不想改变原代的时候;

      如果没有实现接口又想使用代理功能的话,可以去看看cglib动态代理。

    

jdk的动态代理和静态代理你还写不出来嘛???的更多相关文章

  1. Java代理(静态代理、JDK动态代理、CGLIB动态代理)

    Java中代理有静态代理和动态代理.静态代理的代理关系在编译时就确定了,而动态代理的代理关系是在运行期确定的.静态代理实现简单,适合于代理类较少且确定的情况,而动态代理则给我们提供了更大的灵活性. J ...

  2. Java代理:静态代理、JDK动态代理和CGLIB动态代理

    代理模式(英语:Proxy Pattern)是程序设计中的一种设计模式.所谓的代理者是指一个类别可以作为其它东西的接口.代理者可以作任何东西的接口:网络连接.存储器中的大对象.文件或其它昂贵或无法复制 ...

  3. Java代理模式/静态代理/动态代理

    代理模式:即Proxy Pattern,常用的设计模式之一.代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问. 代理概念 :为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委 ...

  4. Atitit 代理CGLIB 动态代理 AspectJ静态代理区别

    Atitit 代理CGLIB 动态代理 AspectJ静态代理区别 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 spring AOP 为 ...

  5. 【Java】代处理?代理模式 - 静态代理,动态代理

    >不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算, ...

  6. Java中的代理模式--静态代理和动态代理本质理解

    代理模式定义:为其他对象提供了一种代理以控制对这个对象的访问. 代理模式的三种角色: Subject抽象主题角色:抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求. Real ...

  7. java 基础 --- 动态代理和静态代理

    问题  : 代理的应用场景是什么 动态代理的底层原理是什么,为什么只能继承接口 概述 代理模式是设计模式的一种,简单地说就是调用代理类的方法实际就是调用真实类的方法.这种模式在AOP (切面编程)中非 ...

  8. SpringAOP用到了什么代理,以及动态代理与静态代理的区别

    spring aop (面向切面)常用于数据库事务中,使用了2种代理. jdk动态代理:对实现了接口的类生成代理对象.要使用jdk动态代理,要求类必须要实现接口. cglib代理:对类生成代理对象. ...

  9. Java动态代理与静态代理以及它能为我们做什么

    相信我们在网上和平时学习和工作中或多或少都接触过Java的代理模式,经常听到什么静态代理.动态代理的一些名词.但我们是否真的很清楚这些呢?至少我在面试时,发现很多人并不很清楚. 首先代理比较好理解,就 ...

随机推荐

  1. gitlab-centos的安装

    一:gitlab-CentOS的安装  1. 环境准备 1 [root@1-231 ~]# cat /etc/redhat-release 2 CentOS Linux release 7.4.170 ...

  2. 左叶子之和(sum-of-left-leaves)

    LeetCode题目--左叶子之和(sum-of-left-leaves) 计算给定二叉树的所有左叶子之和. 示例: 3 / \ 9 20 / \ 15 7 在这个二叉树中,有两个左叶子,分别是 9 ...

  3. Vim最强调试插件:vimspector

    最近看到了韦大在知乎的回答后,想去试用一下vimspector,却发现vimspector诞生两年了却没有介绍它的中文资料.我查阅官方文档遇到不少困难,在这里记录折腾出来的结果,与大家分享. vims ...

  4. react中 受控组件和 非受控组件 浅析

    一 受控组件 顾名思义,受控 也就是能够被控制,简而言之也就是 该组件ui的显示或者内部state逻辑的变化依赖外部的 props的传入. 二 非受控组件 顾名思义,非受控,也就是内部的视图变化,st ...

  5. 【线段树】BZOJ 5334 数学计算

    题目内容 小豆现在有一个数\(x\),初始值为\(1\).小豆有\(Q\)次操作,操作有两种类型: 1 m:\(x=x×m\),输出\(x\ mod\ M\): 2 pos:\(x=x/\)第\(po ...

  6. 每天一个linux命令:ps命令

      Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进 ...

  7. lumen路由

    $router->get('/', function () use ($router) { return config('options.author'); }); $router->ge ...

  8. 第二十四章 IPtables防火墙

    一.iptables防火墙基本概述 1.应用场景 1.主机安全2.端口转发/ip转发3.内部共享上网 2.iptables工作流程 1.配置防火墙规则可以添加在下面,也可以添加在前面,是有顺序的2.匹 ...

  9. 在VMware虚拟机Ubuntu使用traceroute

    Linux traceroute命令用于显示数据包到主机间的路径 traceroute指令让你追踪网络数据包的路由途径,预设数据包大小是40Bytes,用户可另行设置. Ubuntu命令行输入: 后面 ...

  10. 编写C语言的两种方法----Visual Studio/CodeBlocks

    1.CodeBlock(安装简单) 参考这个博客的:https://blog.csdn.net/jjjjkkjkk/article/details/80331625?utm_medium=distri ...