一.静态代理

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

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. 苹果禁用UUID了,咋办?

    By now you have probably heard that Apple is deprecating support for attaining a UDID from an iOS de ...

  2. 怎样运用servlet

    制作登陆界面 login.html <!DOCTYPE html> <html> <head> <title>login.html</title& ...

  3. 咏南中间件增加HTTPS.SYS支持

    咏南中间件增加HTTPS.SYS支持 老客户可免费升级. HTTPS.SYS可以开发强大而稳定的REST SERVER. 微软在Windows Vista (server 2008) 以后使用http ...

  4. The Scope Chain

    JavaScript is a lexically scoped language: the scope of variable can be thought of as the set of sou ...

  5. Solr 从文件创建索引

    http://blog.csdn.net/clj198606061111/article/details/21492457 http://wiki.apache.org/solr/Extracting ...

  6. (zxing.net)一维码EAN 8的简介、实现与解码

    一.简介 一维码EAN 8:属于国际标准条码,由8个数字组成,属EAN的简易编码形式(EAN缩短码).当包装面积小于120平方公分以下无法使用标准码时,可以申请使用缩短码. 依结构的不同,EAN条码可 ...

  7. Linq与数据库的连接显示查询(一)

    使用linq查询sql数据库是首先需要创建一个 linq  to  sql 类文件 创建linq  to  sql的步骤: 1在Visual  Studio 2015开发环境中建立一个目标框架 Fra ...

  8. Window 10 单机配置MYSQL主从同步

    Master数据库:127.0.0.1:3306 Slave数据库:127.0.0.1:3307 Master操作 修改ini信息 Master MYSQL安装目录下,找到my.ini,在[mysql ...

  9. django drf CreateModelMixin和Serializer.validate_columun

    view demo class ValidateCodeSet(mixins.CreateModelMixin, viewsets.GenericViewSet): serializer_class ...

  10. Neutron 是怎么实现虚拟三层网络的

    Neutron 对虚拟三层网络的实现是通过其 L3 Agent (neutron-l3-agent).该 Agent 利用 Linux IP 栈.route 和 iptables 来实现内网内不同网络 ...