动态代理入门(jdk)
动态代理就是aop的核心,动态代理简单的就是通过创建一个代理对象,然后把原来的方法增强。很抽象,例子是王道。jdk中提供了动态代理的实现,但是它是针对接口,如果要实现动态代理,需要被代理对象的接口。这是它的缺点,不能为了实现动态代理,都要给被代理对象写个接口,在web开发中有时很麻烦,这样就出现了通过直接改变字节码,写个子类重写需要增强的方法,但是如果这个类中的方法定义为final,它也没办法了。
1.委托类需要实现的接口
package 动态代理;
public interface heelo {
String sayHello();
void sayGoodble();
}
2、委托类的具体实现
package 动态代理;
public class HelloImpl implements heelo{
@Override
public String sayHello() {
// TODO Auto-generated method stub
return "heelo";
}
@Override
public void sayGoodble() {
// TODO Auto-generated method stub
System.out.println("goodBye");
}
}
3.handler(advice)
package 动态代理; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class HelloHander implements InvocationHandler{ HelloImpl hip=null; //传入被代理的对象
public HelloHander(HelloImpl hip)
{
this.hip=hip; }
@Override
//
public Object invoke(Object arg0, Method arg1, Object[] arg2)
throws Throwable { // TODO Auto-generated method stub
System.out.println("before "+arg1.getName());
Object res=arg1.invoke(hip, arg2);//被代理的对象原来的逻辑
System.out.println("after "+arg1.getName());
return res;
//此处请注意啊,执行顺序。 } }
4.客户端
package 动态代理;
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
HelloImpl hl=new HelloImpl();//target,被代理的对象
HelloHander hh=new HelloHander(hl);//创建一个处理器,类似advice
//创建一个代理对象,为target的所有方法进行代理
heelo h=(heelo) Proxy.newProxyInstance(hl.getClass().getClassLoader(), hl.getClass().getInterfaces(), hh);
//调用sayHeelo方法
System.out.println(h.sayHello());
System.out.println();
//调用sayBye
h.sayGoodble();
}
}
动态代理入门(jdk)的更多相关文章
- Java 的静态代理 动态代理(JDK和cglib)
转载:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是 ...
- [转]java动态代理(JDK和cglib)
转自:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理 ...
- java动态代理(JDK和cglib)
转:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代 ...
- 《转》JAVA动态代理(JDK和CGLIB)
该文章转自:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的 ...
- 《转》java动态代理(JDK和cglib)
该文章转自:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的 ...
- java动态代理(JDK和cglib实现对比)
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt214 JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特 ...
- Spring学习(四)—— java动态代理(JDK和cglib)
JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他 的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托 ...
- java动态代理(JDK和cglib)(转载)
原文地址:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html 高亮部分是我的理解. JAVA的动态代理 代理模式 代理模式是常用的j ...
- Java中的动态代理(jdk和cglib)
JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类 ...
- 静态代理和动态代理(jdk/cglib)详解
1.静态代理模式 代理模式上,基本上有Subject角色,RealSubject角色,Proxy角色.其中:Subject角色负责定义RealSubject和Proxy角色应该实现的接口:RealSu ...
随机推荐
- 006.Compile方法
Delphi procedure Compile; 类型:procedure 可见性:public 所在单元:System.RegularExpressionsCore 父类:TPerlRegEx 此 ...
- python AES 加密与解密
#用aes加密,再用base64 encode def aes_encrypt(data): from Crypto.Cipher import AES import base64 key=setti ...
- Dev-C++之开启装逼效果
Dev-C++是个不错的C++IDE——在10年前,它是很不错,在现在,它是个以界面丑陋和调试像吃粑粑这两点著称,如下图.
- 几种C#实现播放声音的方法
在这里介绍使用C#实现播放声音的几种方法,都是利用组件等方法来实现的,有兴趣的话可以看下. 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroS ...
- JQ实现3D拖拽效果
<!DOCTYPE HTML> <html onselectstart='return false'> <head> <meta http-equiv=&qu ...
- About Interface
http://www.codeproject.com/Articles/18743/Interfaces-in-C-For-Beginners Interface can't have thi ...
- javascript 闭包暴露句柄和命名冲突的解决方案
暴露 最近在琢磨前端Js开源项目的东西,然后就一直好奇他们是怎么句柄暴露出来的,特整理一下两种方法. 将对象悬挂到window下面. 不使用var进行变量声明.下面上代码: (function(win ...
- shell 流程控制
for循环: #!/bin/bash for file in $(ls /ect) do echo $file done
- LibLinear(SVM包)使用说明之(三)实践
LibLinear(SVM包)使用说明之(三)实践 LibLinear(SVM包)使用说明之(三)实践 zouxy09@qq.com http://blog.csdn.net/zouxy09 我们在U ...
- MongoDB实战指南(一):大数据与云计算
1.1 什么大数据 具体来说,大数据技术涉及到数据的创造,存储,获取和分析,大数据的主要特点有下面几个: 数据量大.一个典型的PC机载2000年前后其存储空间可能有10GB,今天facebook一天增 ...