当前位置: 首页 > news >正文

文章类网站选什么内容/南宁优化网站收费

文章类网站选什么内容,南宁优化网站收费,做三级分销网站设计,万达做的电商网站动态代理的实现 使用的模式:代理模式。代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。类似租房的中介。 两种动态代理:(1)jdk动态代理,jdk动态代理是由Java内部的反射机制来实现的&…

动态代理的实现

使用的模式:代理模式。
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。类似租房的中介。

两种动态代理:
(1)jdk动态代理,jdk动态代理是由Java内部的反射机制来实现的,目标类基于统一的接口(InvocationHandler)
(2)cglib动态代理,cglib动态代理底层则是借助asm来实现的,cglib这种第三方类库实现的动态代理应用更加广泛,且在效率上更有优势。

主要应用的框架:
Spring中的AOP,Struts2中的拦截器

具体实现:


 

1、定义接口和实现类

接口

复制代码
1 package com.example.service;
2 
3 public interface UserService {
4     public String getName(int id);
5 
6     public Integer getAge(int id);
7 }
复制代码

实现类

复制代码
package com.example.service.impl;import com.example.service.UserService;public class UserServiceImpl implements UserService {public String getName(int id) {System.out.println("------getName------");return "cat";}public Integer getAge(int id) {System.out.println("------getAge------");return 10;}
}
复制代码

2、jdk动态代理实现

复制代码
package com.example.jdk;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class MyInvocationHandler implements InvocationHandler {private Object target;/*** 绑定委托对象并返回一个代理类** @param target* @return*/public Object bind(Object target) {this.target = target;//取得代理对象return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);   //要绑定接口(这是一个缺陷,cglib弥补了这一缺陷)}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if ("getName".equals(method.getName())) {System.out.println("------before " + method.getName() + "------");Object result = method.invoke(target, args);System.out.println("------after " + method.getName() + "------");return result;} else {Object result = method.invoke(target, args);return result;}}
}
复制代码
复制代码
package com.example.jdk;import com.example.service.UserService;
import com.example.service.impl.UserServiceImpl;/*** 测试类*/
public class RunJDK {public static void main(String[] args) {MyInvocationHandler proxy = new MyInvocationHandler();UserService userServiceProxy = (UserService) proxy.bind(new UserServiceImpl());System.out.println(userServiceProxy.getName(1));System.out.println(userServiceProxy.getAge(1));}
}
复制代码

运行结果:
------before getName------
------getName------
------after getName------
cat
------getAge------
10

3、cglib动态代理实现:

JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

CGLIB的核心类:
net.sf.cglib.proxy.Enhancer – 主要的增强类
net.sf.cglib.proxy.MethodInterceptor – 主要的方法拦截类,它是Callback接口的子接口,需要用户实现
net.sf.cglib.proxy.MethodProxy – JDK的java.lang.reflect.Method类的代理类,可以方便的实现对源对象方法的调用。

net.sf.cglib.proxy.MethodInterceptor接口是最通用的回调(callback)类型,它经常被基于代理的AOP用来实现拦截(intercept)方法的调用。这个接口只定义了一个方法
public Object intercept(Object object, java.lang.reflect.Method method,
Object[] args, MethodProxy proxy) throws Throwable;

第一个参数是代理对像,第二和第三个参数分别是拦截的方法和方法的参数。原来的方法可能通过使用java.lang.reflect.Method对象的一般反射调用,或者使用 net.sf.cglib.proxy.MethodProxy对象调用。net.sf.cglib.proxy.MethodProxy通常被首选使用,因为它更快。

复制代码
package com.example.cglib;import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class CGLIBProxy implements MethodInterceptor {private Object target;/*** 创建代理对象** @param target* @return*/public Object getInstance(Object target) {this.target = target;Enhancer enhancer = new Enhancer();enhancer.setSuperclass(this.target.getClass());// 回调方法enhancer.setCallback(this);// 创建代理对象return enhancer.create();}@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("++++++before " + methodProxy.getSuperName() + "++++++");System.out.println(method.getName());Object result = methodProxy.invokeSuper(o, objects);System.out.println("++++++after " + methodProxy.getSuperName() + "++++++");return result;}
}
复制代码
复制代码
package com.example.cglib;import com.example.service.UserService;
import com.example.service.impl.UserServiceImpl;/*** 测试CGLIB*/
public class RunCGLIB {public static void main(String[] args) {CGLIBProxy cglibProxy = new CGLIBProxy();UserService userService = (UserService) cglibProxy.getInstance(new UserServiceImpl());userService.getName(1);userService.getAge(1);}
}
复制代码

运行结果:
++++++before CGLIBgetNamegetName0++++++
getName
------getName------
++++++after CGLIBgetNamegetName0++++++
++++++before CGLIBgetAgegetAge1++++++
getAge
------getAge------
++++++after CGLIBgetAgegetAge1++++++

 

转载于:https://www.cnblogs.com/luozhijun/p/6895464.html

http://www.jmfq.cn/news/5206843.html

相关文章:

  • 做网站设计都需要什么软件/游戏推广怎么做挣钱
  • 在深圳做的网站好做吗/郑州网站关键词优化公司
  • 山东德州如何网站建设教程/网游推广员
  • 复制别人的代码做网站/推广app接单网
  • 宁波论坛建站模板/seo技术培训中心
  • 如何做一家专门卖零食的网站/云盘网页版登录
  • 浙江网站建设方案/鞍山做网站的公司
  • 互联网推广策略/安徽网络推广和优化
  • 关于php动态网站开发的书籍/晋中网站seo
  • 大学选修课网站建设/苏州优化网站公司
  • 青浦营销型网站建设/seo网站推广seo
  • 按揭车在哪个网站可以做贷款/网络代运营推广
  • 邢台做网站邮箱/东莞网络营销平台
  • 一级a做片性视频.网站在线观看/西安seo
  • 网站设计优秀作品/快速网站推广公司
  • 西安专业做网站/做网站的费用
  • 电子商务网站建设新闻/建站系统
  • 哈尔滨网站建设排行/西安自助建站
  • 山东政务网站建设/站长统计 网站统计
  • 有什么样的网站开发/十大免费软文推广平台
  • 映射做网站/2022年最火文案
  • 做购物网站赚钱吗/站长联盟
  • 网站建设互联网 政府系统/百度关键词搜索次数
  • 网站说建设中/百度关键词推广方案
  • 怎么做交易平台网站/谷歌站长平台
  • 做招聘网站需要什么资质/广告推广平台网站
  • 新闻播报最新/优化设计答案五年级上册
  • 网站名称与主办单位/厦门百度快速优化排名
  • 自己如何做外贸公司网站/知道百度
  • 网站地图导出怎么做/网页优化seo公司