静态代理,动态代理,Cglib代理详解
一.静态代理
新建一个接口 定义一个玩家方法:
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代理详解的更多相关文章
- 静态代理和动态代理(jdk/cglib)详解
1.静态代理模式 代理模式上,基本上有Subject角色,RealSubject角色,Proxy角色.其中:Subject角色负责定义RealSubject和Proxy角色应该实现的接口:RealSu ...
- spring AOP 代理(静态与动态+使用cglib实现)
一.没有代理模式 缺点: 1.工作量特别大,如果项目中有多个类,多个方法,则要修改多次. 2.违背了设计原则:开闭原则(OCP),对扩展开放,对修改关闭,而为了增加功能把每个方法都修改了,也不便于维护 ...
- 大厂高级工程师面试必问系列:Java动态代理机制和实现原理详解
代理模式 Java动态代理运用了设计模式中常用的代理模式 代理模式: 目的就是为其他对象提供一个代理用来控制对某个真实对象的访问 代理类的作用: 为委托类预处理消息 过滤消息并转发消息 进行消息被委托 ...
- [转]反向代理过程与Nginx特点详解
原文链接:<Nginx搭建反向代理服务器过程详解> 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内 ...
- 分享知识-快乐自己:三种代理(静态、JDK、CGlib 代理)
1):代理模式(静态代理)点我下载三种模式源码 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. 静态代理由 业务实现类.业务代理类 两部分组成 ...
- Nginx代理功能与负载均衡详解
序言 Nginx的代理功能与负载均衡功能是最常被用到的,关于nginx的基本语法常识与配置已在上篇文章中有说明,这篇就开门见山,先描述一些关于代理功能的配置,再说明负载均衡详细. Nginx代理服务的 ...
- nginx入门与实战 安装 启动 配置nginx Nginx状态信息(status)配置 正向代理 反向代理 nginx语法之location详解
nginx入门与实战 网站服务 想必我们大多数人都是通过访问网站而开始接触互联网的吧.我们平时访问的网站服务 就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务. Web ...
- CentOS 7 配置 Nginx 正向代理 http、https 最详解
手头项目中有使用到 nginx,因为使用的三方云服务器,想上外网需要购买外网IP的,可是有些需要用到外网却不常用的主机也挂个外网IP有点浪费了,便想使用nginx的反向代理来实现多台内网服务器使用一台 ...
- Java代理模式之Cglib代理
Cglib代理,也叫做子类代理.在内存中构建一个子类对象从而实现对目标对象功能的扩展. CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类.不鼓励直接使用ASM,因 ...
- 代理模式之Cglib代理
Cglib代理,也叫做子类代理.在内存中构建一个子类对象从而实现对目标对象功能的扩展. l JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口.如果想代理没有实现接口的类,就可 ...
随机推荐
- swift学习之-- UIAlertViewController -alert
// // ViewController.swift // alertView // // Created by su on 15/12/7. // Copyright © 2015年 tia ...
- hdu5340—Three Palindromes—(Manacher算法)——回文子串
Three Palindromes Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- 开源WebGIS实施方案(四):GeoServer发布PostGIS数据
GeoServer可以支持多种格式的数据源,本文只介绍其中一种,即PostGIS数据源. 新建一个工作区.工作区这个名字也是一变再变,早前叫做目录,后来改为工作空间,如今已变为工作区了. 添加数据存储 ...
- c++中的隐藏及重载、重写与隐藏的区别
c/c++中的隐藏 举个栗子 class A { public : void fun1(int a, int b) { cout<<"abcd"<<end ...
- 疑难杂症--在Windows Server 2008 R2上运行SQL Server 2008情况下,CPU过多导致的问题
64位的Windows7和Windows Server 2008 R2为了能够在一台机器上,支持超过64个逻辑CPU, 引入了Processor Group这个概念.Processor Group会把 ...
- SQL SERVER 查找锁信息
通过系统的存储过程 sp_who 或 sp_who2 可以查找出所有的锁信息, 但是看不出是哪个表, 什么语句 当使用 sp_who 或 sp_who2 查找锁信息的时候, 有个 spid 信息, ...
- C#——Socket
最近公司让我搞个socket小程序(服务端). 主要的功能:客户端发字符串到服务端,服务端接收后在界面上显示. 参照了网上许多代码,自己从中修改整理代码. public Form4() { Initi ...
- 用jquery-table2excel,进行导出excel
jquery-table2excel是一款可以将HTML表格的内容导出到微软Excel电子表格中的jQuery插件.该插件可以根据你的需要导出表格中的内容,不需要的行可以不导出. 它文件体积小,使用非 ...
- WPF 新手引导
参考了https://www.cnblogs.com/ZXdeveloper/p/8391864.html,自己随便实现了一个,记录下,比较丑 <Window x:Class="Use ...
- ASP.NET WebApi总结之自定义权限验证
在.NET中有两个AuthorizeAttribute类, 一个定义在System.Web.Http命名空间下 #region 程序集 System.Web.Http, Version=5.2.3.0 ...