一.静态代理

新建一个接口 定义一个玩家方法:

package com."".proxy.staticc;

public interface Iplayer {
public void play();
}

  建一个你自己玩游戏的类

package com."".proxy.staticc;

public class YourPlayer implements Iplayer {

	public void play() {
System.out.println("登录");
System.out.println("刷图中======");
System.out.println("刷图中======");
System.out.println("刷图中======");
System.out.println("退出"); } }

  建立代理类

package com."".proxy.staticc;

public class DaLiPlayer implements Iplayer{
private Iplayer player = new YourPlayer(); public DaLiPlayer(Iplayer player){
this.player = player;
} //环绕通知
public void play() {
System.out.println("代练");//前置通知
player.play();
System.out.println("还号");//后置通知
} }

开始代理玩游戏

package com."".proxy.staticc;

public class Client {
public static void main(String[] args) {
//传递玩家账号
YourPlayer yourPlayer = new YourPlayer(); //找到代理人
DaLiPlayer daLiPlayer = new DaLiPlayer(yourPlayer); //开始玩游戏
daLiPlayer.play();
}
}

  

二.动态代理

动态代理的方法和静态比较类似 只是可以动态的代理目标 这里展示下具体代码

package com."".jdkproxy;

public interface Iplayer {

	String name = "123";

	public abstract void play();

}

  

package com."".jdkproxy;

public class DnfPlayer implements Iplayer {

	public void play() {

		System.out.println("我只玩DNF,把你们负责人叫出来!");
} }

  

package com."".jdkproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class ProxyPlay implements InvocationHandler{
private Object targetObject = new Object(); public Object createProxy(Object targetObject){
this.targetObject = targetObject;
return Proxy.newProxyInstance(
targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(),
this);
} public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("前置代理");
Object obj = method.invoke(targetObject, args);
System.out.println("后置代理"); return obj;
} }

  

package com."".jdkproxy;

public class Test {
public static void main(String[] args) { //获得需求的玩家
Iplayer player = new DnfPlayer(); //找对应的代理对象
ProxyPlay proxy = new ProxyPlay(); //执行代练方法
Iplayer pl = (Iplayer) proxy.createProxy(player); pl.play(); //魔兽玩家
WowPlayer wow = new WowPlayer();
Iplayer pl2 = (Iplayer) proxy.createProxy(wow);
pl2.play(); }
}

  三.Cglib代理详解

package com."".cglibproxy;

public interface IPlayer {
public void play();
}
package com."".cglibproxy;

public class DNFPlayer implements IPlayer{

	public void play() {
System.out.println("我只玩DNF 给我找个代练"); } }

  

package com."".cglibproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
//cglib代理
public class ProxyHome implements MethodInterceptor{
private Object tarObject; public Object createCglib(Object tarObject){
this.tarObject = tarObject; Enhancer enhancer = new Enhancer();
enhancer.setClassLoader(tarObject.getClass().getClassLoader());
enhancer.setInterfaces(tarObject.getClass().getInterfaces());
enhancer.setCallback(this); return enhancer.create(); } public Object intercept(Object obj, Method method, Object[] args,
MethodProxy arg3) throws Throwable {
System.out.println("给你登录代练开始");
Object object = method.invoke(tarObject, args); System.out.println("给你退出代练结束"); return object;
} }
package com."".cglibproxy;

public class Test {
public static void main(String[] args) {
IPlayer p2 = new DNFPlayer(); ProxyHome proxy = new ProxyHome(); IPlayer tp = (IPlayer) proxy.createCglib(p2);
tp.play(); }
}

静态代理,动态代理,Cglib代理详解的更多相关文章

  1. 静态代理和动态代理(jdk/cglib)详解

    1.静态代理模式 代理模式上,基本上有Subject角色,RealSubject角色,Proxy角色.其中:Subject角色负责定义RealSubject和Proxy角色应该实现的接口:RealSu ...

  2. spring AOP 代理(静态与动态+使用cglib实现)

    一.没有代理模式 缺点: 1.工作量特别大,如果项目中有多个类,多个方法,则要修改多次. 2.违背了设计原则:开闭原则(OCP),对扩展开放,对修改关闭,而为了增加功能把每个方法都修改了,也不便于维护 ...

  3. 大厂高级工程师面试必问系列:Java动态代理机制和实现原理详解

    代理模式 Java动态代理运用了设计模式中常用的代理模式 代理模式: 目的就是为其他对象提供一个代理用来控制对某个真实对象的访问 代理类的作用: 为委托类预处理消息 过滤消息并转发消息 进行消息被委托 ...

  4. [转]反向代理过程与Nginx特点详解

    原文链接:<Nginx搭建反向代理服务器过程详解> 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内 ...

  5. 分享知识-快乐自己:三种代理(静态、JDK、CGlib 代理)

    1):代理模式(静态代理)点我下载三种模式源码 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. 静态代理由 业务实现类.业务代理类 两部分组成 ...

  6. Nginx代理功能与负载均衡详解

    序言 Nginx的代理功能与负载均衡功能是最常被用到的,关于nginx的基本语法常识与配置已在上篇文章中有说明,这篇就开门见山,先描述一些关于代理功能的配置,再说明负载均衡详细. Nginx代理服务的 ...

  7. nginx入门与实战 安装 启动 配置nginx Nginx状态信息(status)配置 正向代理 反向代理 nginx语法之location详解

    nginx入门与实战 网站服务 想必我们大多数人都是通过访问网站而开始接触互联网的吧.我们平时访问的网站服务 就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务. Web ...

  8. CentOS 7 配置 Nginx 正向代理 http、https 最详解

    手头项目中有使用到 nginx,因为使用的三方云服务器,想上外网需要购买外网IP的,可是有些需要用到外网却不常用的主机也挂个外网IP有点浪费了,便想使用nginx的反向代理来实现多台内网服务器使用一台 ...

  9. Java代理模式之Cglib代理

    Cglib代理,也叫做子类代理.在内存中构建一个子类对象从而实现对目标对象功能的扩展. CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类.不鼓励直接使用ASM,因 ...

  10. 代理模式之Cglib代理

    Cglib代理,也叫做子类代理.在内存中构建一个子类对象从而实现对目标对象功能的扩展. l  JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口.如果想代理没有实现接口的类,就可 ...

随机推荐

  1. JoinMap

    #include <iostream> #include <fstream> using namespace std; #include <opencv2/core/co ...

  2. Android代码实现求和运算

    Android代码实现求和运算 实验要求: 用Android语言设计一个界面,点击某按钮实现求和运算. 代码实现 码云链接 核心代码 以上为求和按钮的代码截图,解析如图标注. 实验结果 当输入为空值时 ...

  3. Linux 基础教程 34-软件包管理-RPM

        对于Linux而言管理各类软件,如安装.卸载和升级等是常有的事情和必备的技能.以CentOS为例,常用的安装包命令有rpm和yum. RPM基础     RPM(RedHat Package ...

  4. 可用免费asp.net空间

    免费试用空间: 支持到.net 4.6,有sql server数据.1G空间,500M数据库.免费使用60天.可绑定一二级域名.到期不能再绑定已绑定过的域名. http://www.mywindows ...

  5. 团体程序设计天梯赛L1-019 谁先倒 2017-03-22 17:35 33人阅读 评论(0) 收藏

    L1-019. 谁先倒 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 划拳是古老中国酒文化的一个有趣的组成部分.酒桌上两人划拳 ...

  6. Jetty 源码分析

    一. 总括      你了解Jetty 吗,就像我们所熟知的Tomcat一样, Jetty是一个免费的开放源码的100%纯Java的Http服务器和Servlet容器. Jetty具备以下特点:   ...

  7. jsp request 获取路径

    这篇教程不错:http://zjutsoft.iteye.com/blog/1084260 自己试验如下: System.out.println("-----------------serv ...

  8. C#中哈希表(HashTable)的用法详解

    描述: 哈希表存放 key.values ,key值可以用于快速调取用,values 对应object类型,也就是说所有类型. 实例: 1.HashTable存放学生的成绩 Hashtable ht1 ...

  9. MVC ViewData与ViewBag的区别

    一.ViewData 1.ViewData派生自ViewDataDictionary,所以它具有字典的属性,例如:ContainsKey .Add .Remove 和 Clear : 2.字典键值是字 ...

  10. 开源应用框架BitAdminCore:更新日志20180817

    索引 NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxin/coo ...