首先说一下我们什么情况下使用代理?

(1)设计模式中有一个设计原则是开闭原则,是说对修改关闭对扩展开放,我们在工作中有时会接手很多前人的代码,里面代码逻辑让人摸不着头脑(sometimes the code is really like shit),这时就很难去下手修改代码,那么这时我们就可以通过代理对类进行增强。

(2)我们在使用RPC框架的时候,框架本身并不能提前知道各个业务方要调用哪些接口的哪些方法 。那么这个时候,就可用通过动态代理的方式来建立一个中间人给客户端使用,也方便框架进行搭建逻辑,某种程度上也是客户端代码和框架松耦合的一种表现。

(3)Spring的AOP机制就是采用动态代理的机制来实现切面编程。
---------------------

一,静态代理

package org.rcisoft.business.reflectDemo;

/**
* @author: wsj
* @date: 2018/10/13
* @time: 18:18
*/
//静态代理
//接口
public interface StaticReflect {
void show();
}
//被代理类
class Nike implements StaticReflect{
@Override
public void show() {
System.out.println("nike开始生产衣服...");
}
}
//代理类
class ProxyClass implements StaticReflect{
StaticReflect sr; public ProxyClass(StaticReflect st){
this.sr = st;
}
@Override
public void show() {
System.out.println("代理类开始执行,收代理费$10");
sr.show();
}
} class testStaticReflect{
public static void main(String[] args) {
Nike nick = new Nike();
ProxyClass proxyClass = new ProxyClass(nick); proxyClass.show();
}
}

二,动态代理

package org.rcisoft.business.reflectDemo;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; /**
* @author: wsj
* @date: 2018/10/13
* @time: 18:42
*/ public interface ProxyTest { }
//反射之动态代理
//接口
interface Subject{
void action();
}
//被代理类
class RealSubject implements Subject{
@Override
public void action() {
System.out.println("动态被代理类开始执行啦!...");
}
}
//代理类
class MyInvocationHandler implements InvocationHandler {
Object obj; //实现了被代理类的对象的说明 public Object blind(Object obj) {
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this); } @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws InvocationTargetException, IllegalAccessException {
return method.invoke(obj, args);
}
}
class testProxyMethod{
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
MyInvocationHandler myInvocationHandler = new MyInvocationHandler();
Subject subject = (Subject) myInvocationHandler.blind(realSubject);
realSubject.action();
}
}

java 反射之静态and动态代理的更多相关文章

  1. java反射机制应用之动态代理

    1.静态代理类和动态代理类区别 静态代理:要求被代理类和代理类同时实现相应的一套接口:通过代理类的对象调用重写接口的方法时,实际上执行的是被代理类的同样的 方法的调用. 动态代理:在程序运行时,根据被 ...

  2. java静态和动态代理原理

    一.代理概念 为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代.代理类负责请求的预处理.过滤.将请求分派给委托类 ...

  3. 动态代理:JDK原生动态代理(Java Proxy)和CGLIB动态代理原理+附静态态代理

    本文只是对原文的梳理总结,以及自行理解.自己总结的比较简单,而且不深入,不如直接看原文.不过自己梳理一遍更有助于理解. 详细可参考原文:http://www.cnblogs.com/Carpenter ...

  4. Java反射及注解学习- 反射的使用 - JDK动态代理

    代理模式基本概念:1.代理模式的作用:为其他对象提供一种以控制对方的访问在某种情况下,一个客户不想或者不能直接引用另一个对象,代理可以在客户端和目标对象之间起到中介的作用代理的角色:(1)抽象角色:声 ...

  5. JAVA反射机制--静态加载与动态加载

    Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如pu ...

  6. java 面向对象(四十三):反射(七)反射应用四:动态代理

    1.代理模式的原理:使用一个代理将对象包装起来, 然后用该代理对象取代原始对象.任何对原始对象的调用都要通过代理.代理对象决定是否以及何时将方法调用转到原始对象上. 2.静态代理2.1 举例:实现Ru ...

  7. Java编程的逻辑 (86) - 动态代理

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  8. Java基础加强-(注解,动态代理,类加载器,servlet3.0新特性)

    1.   Annotation注解 1.1.  Annotation概述 Annotation是JDK 5.0以后提供对元数据的支持,可以在编译.加载和运行时被读取,并执行相应的处理.所谓Annota ...

  9. java开发必学知识:动态代理

    目录 1. 引言 2. 代理模式及静态代理 2.1 代理模式说明 2.2 静态代理 2.3 静态代理局限性 3. 动态代理 3.1 JAVA反射机制 3.2 JDK动态代理 3.2.1 JDK动态代理 ...

随机推荐

  1. Spine学习一 -渲染组件

    一共有四个播放的组件: SkeletonAnimation:有点儿类似于 unity的 Animation,挂上一个spine资源,就可以跑了 SkeletonRenderer:SkeletonAni ...

  2. 小花梨判连通 (bfs+思维+map统计数量)

    如果两个集合存储颜色的情况相同,说明这两个在k个图中都是在一个集合的 学到的点:用map,将vector映射一个整数时,只有vector后面的邻接的数据都一样时,才认为两个vector一样 代码: # ...

  3. Windows安装tensorflow教程 GPU版

    PS:这是GPU版本,CPU版会用笔记本环境另写一篇博客. 前置准备 查看GPU型号 电脑桌面->右键我的电脑->选择管理->点击设备管理器  如下图: 如果不是英伟达显卡,那么不用 ...

  4. JSTL日期格式化用法

    JSP Standard Tag LibrariesFormatting and InternationalizationTwo form input parameters, 'date' and ' ...

  5. Java模拟实现扫雷功能

    //棋子 public class Chess { private boolean isBoomb=false; private int id;//下标 //点击方法 public int click ...

  6. Unity3D获得服务器时间/网络时间/后端时间/ServerTime,适合单机游戏使用

    说明 一些游戏开发者在做单机游戏功能时(例如:每日奖励.签到等),可能会需要获得服务端标准时间,用于游戏功能的逻辑处理. 问题分析 1.自己如果有服务器:自定义一个后端API,客户端按需请求就行了: ...

  7. Docker学习笔记,从原理到实践

    什么是docker Docker是使用go语言基于LINUX内核的cgroup,namespace以及AUFS 类的 Union FS 等技术,对进程进行封装隔离的一种操作系统层面的虚拟化技术,由于隔 ...

  8. 【二叉树-BFS系列1】二叉树的右视图、二叉树的锯齿形层次遍历

    题目 199. 二叉树的右视图 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5,null,4] 输出: [1, ...

  9. 云计算openstack核心组件——glance— 镜像服务(6)

    一.glance介绍:              Glance是Openstack项目中负责镜像管理的模块,其功能包括虚拟机镜像的查找.注册和检索等. Glance提供Restful API可以查询虚 ...

  10. 对比ERP解读企业资产管理EAM在电力行业应用

    对比ERP解读企业资产管理EAM在电力行业应用 .关于EAMEAM (Enterprise Asset Management)企业资产管理,是面向固定资产占企业资产主要部分的资产密集型(Capital ...