java--动态代理设计模式,CGLIB实现的动态代理设计模式
package com.hbsi.test;
interface Food{
public void eat();
}
class ProxyFood implements Food{
private Food food;
public ProxyFood(Food food) {
this.food = food;
}
public void after() {
System.out.println("饭后");
}
public void before() {
System.out.println("饭前");
}
@Override
public void eat() {
this.after();
this.food.eat();//调用RealFood中的eat方法
this.before();
}
}
class RealFood implements Food{
@Override
public void eat() {
System.out.println("吃饭 ,,,,,RealFood");
}
}
public class ProxyDemo {
public static void main(String[] args) {
Food f = new ProxyFood(new RealFood());
f.eat();
}
}
在什么情况下代理设计模式可能会被使用?最常用的形式就是在系统日志上进行,
- public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h)
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyProxyd implements InvocationHandler{
private Object target;//要代理的对象信息
public Object bind(Object target) {
this.target = target;//赋值
//返回与当前传入对象结构相同的代理类对象
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces() , this);
}
@Override//参数说明:代理的对象。表示真实主体类要执行的方法。方法需要的参数
public Object invoke(Object proxy, Method method, Object[] arg) throws Throwable {
this.log();
Object invoke = method.invoke(this.target, arg);//调用真实类的方法
this.commit();
return invoke;
}
private void log() {
System.out.println("执行记录日志方法");
}
private void commit() {
System.out.println("事务提交");
}
public static void main(String[] args) {
Food f = (Food) new MyProxyd().bind(new RealFood());
f.eat();
}
}
public class RealFood implements Food{
@Override
public void eat() {
System.out.println("吃饭 ,,,,,RealFood");
}
}
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
class PrintMes {
public void print() {
System.out.println("吃饭 ,,,,,");
}
}
public class CGLIBProxy {
public static void main(String[] args) {
PrintMes mes = new PrintMes();//
Enhancer enhancer = new Enhancer();//代理类对象
enhancer.setSuperclass(mes.getClass());//为代理类设置一个父类,自我理解就是做关联
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] objs, MethodProxy proxy) throws Throwable {
System.out.println("饭前洗手");
return method.invoke(mes, args);
}
});
PrintMes create = (PrintMes) enhancer.create();//返回代理对象
create.print();//调用
}
}
java--动态代理设计模式,CGLIB实现的动态代理设计模式的更多相关文章
- 性能优于JDK代理,CGLib如何实现动态代理
按照代理的创建时期,代理类可以分为两种. 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. 动态代理:在程序运行时,运用反射机制动态创建 ...
- java提供类与cglib包实现动态代理
终于有点空余时间,决定把之前学习的知识点整理一下,备以后复习. 动态代理有三角色:抽象角色,代理角色,真是角色. 第一个记录下java提供的动态代理.即使用Proxy类和InvocationHande ...
- java动态代理--proxy&cglib
大纲 代理 proxy cglib 小结 一.代理 为什么要用代理?其实就是希望不修改对象的情况下,增强对象. 静态代理: 静态代理模式,需要代理类和目标类实现同一接口,代理类的方法调用目标类的方法, ...
- 学习CGLIB与JDK动态代理的区别
动态代理 代理模式是Java中常见的一种模式.代理又分为静态代理和动态代理.静态代理就是显式指定的代理,静态代理的优点是由程序员自行指定代理类并进行编译和运行,缺点是一个代理类只能对一个接口的实现类进 ...
- CGLib方式对接口实现代理
JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了.CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采 ...
- java设计模式(一)动态代理模式,JDK与CGLIB分析
-本想着这个知识点放到Spring Aop说说可能更合适一点,但因为上一篇有所提到就简单分析下,不足之处请多多评论留言,相互学习,有所提高才是关键! 什么是代理模式: 记得有本24种设计模式的书讲到代 ...
- Java动态代理与Cglib库
JDK动态代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在 ...
- Java代理(jdk静态代理、动态代理和cglib动态代理)
一.代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强.加入一些非业务性代码,比如事务.日志.报警发邮件等操作. 二.jdk静态代理 1.业务接口 /** * 业务接 ...
- [z]Java代理(jdk静态代理、动态代理和cglib动态代理)
一.代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强.加入一些非业务性代码,比如事务.日志.报警发邮件等操作. 二.jdk静态代理 1.业务接口 1 2 3 4 5 ...
- 代理模式 & Java原生动态代理技术 & CGLib动态代理技术
第一部分.代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常 ...
随机推荐
- C# WinForm获取 当前执行程序路径的几种方法(转)
1.获取和设置当前目录的完全限定路径. string str = System.Environment.CurrentDirectory; Result: C:xxxxxx 2.获取启动了应用程序的可 ...
- vfp
DROP 从目前资料库中移出资料表格,并从磁碟上将它删除.DELETE 标示要删除的记录.只是标记,没有删除.ZAP 从资料表格中移除所有记录,仅保留资料表格结构.PACK 从目前资料库中移除标示为删 ...
- APT攻击与银行
APT与传统攻击 APT:团队作战,拥有自研工具集,意图明确,技术高超,拥有政府或商业背景,潜伏期多达数年. 传统攻击:脚本小子,水平参差不齐,短期攻击,直接获取利益为目标. 攻击目标 APT攻击链 ...
- Java program to find the largest element in array
Java program to find the largest element in array Given an array of numbers, write a java program to ...
- [转帖]大数据hadoop与spark的区别
大数据hadoop与spark的区别 https://www.cnblogs.com/adnb34g/p/9233906.html Posted on 2018-06-27 14:43 左手中倒影 阅 ...
- 过滤器( filter )的使用
转自:https://www.jianshu.com/p/2ea2b0e4d1f2 过滤器通常 在 web 服务端用的比较多,有要功能 在客户端的请求访问后端资源之前,拦截这些请求. 在服务器的响应发 ...
- Java之——实现微信小程序加密数据解密算法
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/79450115 一.概述 微信推出了小程序,很多公司的客户端应用不仅具有了APP.H ...
- spring security关闭http验证 和 springboot 使用h2数据库
spring security关闭http验证 最近在跑demo的过程中,访问swagger页面的时候需要验证登录,记得在之前写的代码中是关闭了security验证,无需登录成功访问,直接在appli ...
- java面向函数编程简单应用
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.functio ...
- PAT(B) 1054 求平均值(Java)
题目链接:1054 求平均值 (20 point(s)) 题目描述 本题的基本要求非常简单:给定 N 个实数,计算它们的平均值.但复杂的是有些输入数据可能是非法的.一个"合法"的输 ...