MyBatis之反射技术+JDK动态代理+cglib代理
一、反射
引用百度百科说明:
package cn.reflect; import java.lang.reflect.Method; public class ReflectService { /**
* 测试方法
* @param name
*/
public void testReflect(String name) {
System.out.println("hello:"+name);
} /**
* 测试入口
* @throws Exception
*/
public static void main(String[] args) throws Exception { /**
* 通过反射创建ReflectService对象
*/
Object service = Class.forName(ReflectService.class.getName()).newInstance(); /**
* 获取服务方法
*/
Method method = service.getClass().getMethod("testReflect", String.class); method.invoke(service, "张三"); } }
反射调用的最大好处是配置性大大提高,如同IOC容器,我们可以给很多配置设置多个参数,使得Java程序能够快速运行,大大提高Java的灵活性和可配置性,降低模块之间的耦合度
二、JDK动态代理
基本演示示例如下:
package cn.reflect; public interface HelloService { public void sayHello(String name);
}
package cn.reflect; public class HelloServiceImpl implements HelloService { public void sayHello(String name) {
// TODO Auto-generated method stub
System.err.println("hello:"+name);
} }
package cn.reflect; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class HelloServiceProxy implements InvocationHandler { /**
* 真实服务对象
*/
private Object target; public Object bind(Object target){
this.target=target;
/**
* 取得代理对象
*/
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);//jdk代理对象需要提供接口 } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub System.out.println("我是JDK动态代理对象"); Object result = null; /**
* 反射方法调用前
*/
System.out.println("我准备说hello"); /**
* 执行方法,相当于调用HelloServiceImpl中的sayHello方法
*/
result = method.invoke(target, args); /**
* 反射方法后调用
*/
System.out.println("我说过hello了"); return result; } }
package cn.reflect; public class HelloServiceMain {
public static void main(String[] args) { HelloServiceProxy helloHandle = new HelloServiceProxy(); HelloService proxy = (HelloService) helloHandle.bind(new HelloServiceImpl());
proxy.sayHello("张三"); }
}
三、cglib代理
JDK提供的动态代理存在缺陷,必须提供接口才能使用,没有接口就不能使用,为了克服这个缺陷,我们可以采用cglib代理,它是一种流行的动态代理
package cn.reflect; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy; public class HelloServiceCgLib implements MethodInterceptor{
private Object target; /**
* 创建代理对象
*/
public Object getInstance(Object target) { this.target=target;
Enhancer enHancer = new Enhancer();
enHancer.setSuperclass(this.target.getClass());
enHancer.setCallback(this);
return enHancer.create(); } public Object intercept(Object obj, Method method, Object[] arg, MethodProxy proxy) throws Throwable {
// TODO Auto-generated method stub
System.out.println("我是cglib代理对象");
Object returnObj = proxy.invoke(obj, arg); /**
* 反射方法前调用
*/
System.out.println("我准备说hello"); /**
* 反射方法后调用
*/
System.out.println("我说过hello了"); return returnObj; } }
pom依赖
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.4</version>
</dependency>
MyBatis之反射技术+JDK动态代理+cglib代理的更多相关文章
- 获取JDK动态代理/CGLIB代理对象代理的目标对象。
问题描述:: 我现在遇到个棘手的问题,要通过spring托管的service类保存对象,这个类是通过反射拿到的,经过实验发现这个类只能反射取得sservice实现了接口的方法,而extends类的方法 ...
- 总结两种动态代理jdk代理和cglib代理
动态代理 上篇文章讲了什么是代理模式,为什么用代理模式,从静态代理过渡到动态代理. 这里再简单总结一下 什么是代理模式,给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原 ...
- spring的AOP动态代理--JDK代理和CGLIB代理区分以及注意事项
大家都知道AOP使用了代理模式,本文主要介绍两个代理模式怎么设置以及区别,对原文一些内容进行了引用后加入了自己的理解和更深入的阐述: 一.JDK代理和CGLIB代理的底层实现区别* JDK代理只能 ...
- 利用反射生成JDK动态代理
利用反射生成JDK动态代理 在Java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口可以生成JDK动态代理类和动态代理 ...
- Java设计模式--代理模式+动态代理+CGLib代理
静态代理 抽象主题角色:声明真实主题和代理主题的共同接口. 代理主题角色:代理主题内部含有对真实主题的引用,从而在任何时候操作真实主题对象:代理主题提供一个与真实主题相同的接口,以便在任何时候都可以代 ...
- 动态代理+静态代理+cglib代理 详解
代理定义:代理(Proxy):是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 动态代理+静态 ...
- [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程
[.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...
- MyBATIS插件原理第一篇——技术基础(反射和JDK动态代理)(转)
在介绍MyBATIS插件原理前我们需要先学习一下一些基础的知识,否则我们是很难理解MyBATIS的运行原理和插件原理的. MyBATIS最主要的是反射和动态代理技术,让我们首先先熟悉它们. 1:Jav ...
- 动态代理 JDK动态代理 CGLIB代理
代理模式:代理类和被代理类实现共同的接口(或继承),代理类中存有指向被代理类的索引,实际执行时通过调用代理类的方法.实际执行的是被代理类的方法. 而AOP,是通过动态代理实现的. 一.简单来说: JD ...
随机推荐
- WebForm 【上传图片--添加水印】
对图片添加水印,上传 <div> <asp:FileUpload ID="FileUpload1" runat="server" /> ...
- 【Spring】25、Spring代理。 BeanNameAutoProxyCreator 与 ProxyFactoryBean
一般我们可以使用ProxyBeanFactory,并配置proxyInterfaces,target和interceptorNames实现,但如果需要代理的bean很多,无疑会对spring配置文件的 ...
- linux部分常见指令
游走指令 cd: 进入指定位置 cd / 进入到根目录 cd /home 进入到home文件夹 cd - 进入上次所在文件夹 比如 在 / 时 cd /usr/local到loca ...
- Web设计中打开新页面或页面跳转的方法
一.asp.net c# 打开新页面或页面跳转 1. 最常用的页面跳转(原窗口被替代):Response.Redirect("newpage.aspx"); 2. 利用url地址打 ...
- javascript选项卡切换样式
HTML代码 <ul class="touzi_xuan1" id="qixian"> <li>****: </li> &l ...
- Html/Css 初步认识笔记
1.什么是 HTML ? HTML(HyperText Markup Language) 的学名是超文本标记语言. 标记用来表示网页内容要如何显示,自身不显示 .<我就是标记> 标记成对出 ...
- 反编译Apk得到Java源代码
原文章转载自:http://hi.baidu.com/%CB%BF%D4%B5%CC%EC%CF%C2/blog/item/2284e2debafc541e495403ec.html 本人转载自:ht ...
- WANem广域网环境模拟
背景 在测试过程中,往往需要模拟网络环境较差情况下,体验情况,故引入广域网模拟工具辅助测试 安装WANem 步骤1:光盘引导WANem镜像: 步骤2:启动(或者新建虚拟机——选择other insal ...
- 利用python中的gensim模块训练和测试word2vec
word2vec的基础知识介绍参考上一篇博客和列举的参考资料. 首先利用安装gensim模块,相关依赖如下,注意版本要一致: Python >= 2.7 (tested with version ...
- Python实现排列组合
# -*- coding: utf-8 -*-"""Created on Sat Jun 30 11:49:56 2018 @author: zhen"&quo ...