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 ...
随机推荐
- 性能监控(3)–linux下的iostat命令
iostat可以显示cpu与磁盘信息,添加-d参数可以只显示磁盘信息
- Java集合框架——容器的快速报错机制 fail-fast 是什么?
前言:最近看 java 集合方面的源码,了解到集合使用了 fail-fast 的机制,这里就记录一下这个机制是什么,有什么用,如何实现的. 一.fail-fast 简介 fail-fast 机制,即快 ...
- JavaSE 软件工程师 认证考试试卷2
JavaSE 软件工程师 认证考试试卷 笔试 考试时间150分钟 总分 100分 姓 名_______________________ 身份证号___________________ ...
- IDEA项目搭建十——使用slf4j和logback进行日志记录
.简介 java里面日志分为两部分一个门面.一个实现,我们所熟知的SLF4j.Log4j.Log4j2.Logback的日志组件slf4j是门面提供的统一的入口,具体实现由log4j.log4j2.l ...
- DNS协议总结
1.DNS用于根据域名返回ip地址. 2.一般情况下,DNS-server是通过在UDP协议与客户端之间交互的,UDP端口号是53. 特别注意.DNS有时会使用TCP 53端口与客户端进行交互,所以, ...
- Python从入门到精通
最近研究了一下Python,名不虚传,确实挺精彩. 学习一门新的语言,我认为从入门到精通的做法是:下SDK.装IDE.练教程.结合工作应用.不断踩坑进阶.梳理总结 1.下SDK(2.7.15) 下载地 ...
- 三. Redis 主从复制
特点 1. Master可以拥有多个Slave 2. 多个Slave除可以连接一个Master外,还可以连接多个Salve(避免Master挂掉不能同步,当Master挂掉,其中一个Slave会立即变 ...
- Android--清除默认桌面设置和设置默认桌面(转)
http://blog.csdn.net/chaozhung_no_l/article/details/49929177 转自这位大神的博客,感谢这位大神,帮了大忙,谢谢!!
- python网络编程:socket、服务端、客户端
本文内容: socket介绍 TCP: 服务端 客户端 UDP: 服务端 客户端 首发时间:2018-02-08 01:14 修改: 2018-03-20 :重置了布局,增加了UDP 什么是socke ...
- GridSearchCV交叉验证
代码实现(基于逻辑回归算法): # -*- coding: utf-8 -*- """ Created on Sat Sep 1 11:54:48 2018 @autho ...