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 ...
随机推荐
- c# 读取xml 某个节点值
一.xml格式如下: <?xml version="1.0" encoding="UTF-8"?><Freight> <freig ...
- ssm简单整合(注释方法)
1.创建web工程,选择web.xml文件,并导入相关jar包(使用的spring4.0以上版本,) 2.配置web.xml文件,包括spring.xml,springMVC.xml的加载映射,核心操 ...
- Java使用foreach语句对数组成员遍历输出
/** * 本程序使用foreach语句对数组成员进行遍历输出 * @author Lei * @version 2018-7-23 */ public class ForeachDemo { pub ...
- Vim i和a区别
i是当前位置插入 a是当前文字的后面插入
- 【读书笔记】iOS-button只显示在一个界面的右下角,不管界面大小怎么变化(xib,没有使用自动布局)(一)
一,新建立一个工程,Hello,如图所示. 二,Xcode--->New--->File--->FirstViewController---->选中Also create XI ...
- 【读书笔记】iOS-微信公众平台开发最佳实践
一,微信是由腾讯公司广州研发中心产品团队开发,该团队经理张小龙被称为“微信之父”,公司总裁马化腾确定该产品名称为“微信”. 二,常见问题及解决方案. 1,请求URL超时. 这种情况一般是由于服务器网速 ...
- python之 协程
协程: 协程是一种用户态的轻量级线程, 即协程是由用户程序自己控制调度的 1.Greenlet import time # import greenlet from greenlet import g ...
- CMake笔记(一)
CMake,比makefile更方便,虽然手写makefile同样重要 CMake的所有命令均出现在CMakeList.txt中,注意名字不要写错,并置于源代码目录中 # CMake 最低版本号要求 ...
- ArcGIS Server生成文件的权限问题处理
[arcgisserver@gisserver3 usr]$ vi /arcgis/server/usr/init_user_param.sh
- [20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED2.txt
[20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED2.txt --//简单探究12c TABLE ACCESS BY INDEX ROWID BATCH ...