静态代理

第一种实现(基于接口):

1》接口

public interface Hello {
    void say(String msg);
}

2》目标类,至少实现一个接口

public class HelloImpl implements Hello {
public void say(String msg) {
System.out.println("Hi,"+msg);
}
}

3》代理类(与目标类实现相同接口,从而保证功能一致)

public class HelloProxy implements Hello{

    private Hello hello;

    public HelloProxy(Hello hello){
this.hello = hello;
} public void say(String msg){
before();
hello.say(msg);
after();
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}

3》测试

/**
* @Author LZHL
* @Create 2017-02-19 10:26
* @Description
*/
public class Main {
public static void main(String[] args) throws Exception {
HelloImpl target = new HelloImpl();
HelloProxy proxy = new HelloProxy(target);
proxy.say("LZHL");
}
}

第二种实现(基于目标类):

1>目标类

public class HelloTarget {
public void sayHello(String name){
System.out.println("Hi,"+name);
}
}

2>代理类(通过继承目标类,保证功能一致)

public class HelloProxy extends HelloTarget{
  private HelloTarget target;
  public HelloProxy(HelloTarget target){
    this.target = target;
  }
  @Override
public void sayHello(String name) {
this.before();
target.sayHello(name);
this.after();
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}

3>测试

public class Main {
public static void main(String[] args) throws Exception {
HelloTarget target = new HelloTarget();
    HelloProxy proxy= new HelloProxy(target);
proxy.sayHello("LZHL");
}
}

动态代理

动态代理的代理类是在程序运行期间动态生成的,也有两种实现,一种是JDK动态代理,一种是CGLib动态代理

1》JDK动态代理(基于接口实现,与目标类实现相同接口,从而保证功能一致)

/**
* @Author LZHL
* @Create 2017-02-19 12:46
* @Description
*/
public class Main {
public static void main(String[] args){ final HelloImpl target = new HelloImpl(); Object proxyInstance = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
/*
* proxy: 代理对象
* method: 目标对象的方法对象
* args: 目标对象方法的参数
* return: 目标对象方法的返回值
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before");
Object retValue = method.invoke(target, args);
System.out.println("after");
return retValue;
}
});
Hello proxy = (Hello) proxyInstance;
proxy.say("LYX"); //可以把InvocationHandler提取出来,单独写一个类,为了方便大家看,这里我用内部类的形式
        class JDKProxy implements InvocationHandler {
private Object target;
public JDKProxy(Object target){
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(target, args);
after();
return result;
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}
InvocationHandler ih = new JDKProxy(target);
Object proxyInstance2 = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), ih);
Hello proxy2 = (Hello) proxyInstance2;
proxy2.say("LZHL");
}
}

2》CGLib动态代理(基于目标类,通过继承目标类,从而保证功能一致),需要导入cglib-3.2.4.jar包

pom.xml

<dependencies>
<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.4</version>
</dependency> </dependencies>

1)目标类

public class Hi {
public void sayHi(String msg){
System.out.println("Hi,"+msg);
}
}

2)测试

/**
* @Author LZHL
* @Create 2017-02-19 13:19
* @Description
*/
public class Main {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
//设置父类
enhancer.setSuperclass(Hi.class);
//设置回调函数
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object target, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("before");
Object retValue = methodProxy.invokeSuper(target, args);
System.out.println("after");
return retValue;
}
});
Object proxy = enhancer.create();
Hi hi = (Hi) proxy;
hi.sayHi("LXY"); //可以把MethodInterceptor提取出来,单独写一个类,为了方便大家看,这里我用内部类的形式
class CGLibProxy implements MethodInterceptor { public <T> T getProxy(Class<T> clazz){
return (T) Enhancer.create(clazz, this);
}
public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable {
before();
Object result = proxy.invokeSuper(target, args);
after();
return result;
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
} CGLibProxy cgLibProxy = new CGLibProxy();
Hi hi2 = cgLibProxy.getProxy(Hi.class);
hi2.sayHi("LZHL");
}
}
												

Java静态代理和动态代理总结的更多相关文章

  1. 【Java】代处理?代理模式 - 静态代理,动态代理

    >不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算, ...

  2. Java:静态代理 and 动态代理

    代理模式是常用的设计模式,其特征是代理类与委托类具有相同的接口,在具体实现上,有静态代理和动态代理之分.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并 ...

  3. Java基础-静态代理与动态代理比较

    JAVA的静态代理与动态代理比较 静态代理类: 由程序员创建或由特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了.动态代理类: 在程序运行时,运用反射机制动态创建 ...

  4. java中静态代理,动态代理知识的补充

    文章转载自:http://blog.csdn.net/jialinqiang/article/details/8950989 一.Java动态代理 相对于静态代理的代理类在编译时生成(.class文件 ...

  5. java静态代理与动态代理简单分析

    原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/5860749.html 1.动态代理(Dynamic Proxy) 代理分为静态代理和动态代理 ...

  6. 黑马程序员:Java基础总结----静态代理模式&动态代理

    黑马程序员:Java基础总结 静态代理模式&动态代理   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 静态代理模式 public  class  Ts {   ...

  7. Java静态代理和动态代理

    今天介绍一下代理设计模式,在业务场景中使用代理模式的好处有很多,包括什么权限校验,事务管理等等,具体有什么好处大家自动百度吧,我这里只解释代理模式的设计原理.首先这个设计模式出来的时候先是静态代理模式 ...

  8. java中的静态代理和动态代理,入门整理

    静态代理和动态代理主要解决的问题是:在直接访问对象时带来的问题,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后 ...

  9. Java 静态代理与动态代理

    代理模式 设想你的项目依赖第三方,但是你需要对其接口做一些数据检验.性能数据记录.异常处理等,合适的方法就是使用设计模式里的代理模式. 代理模式是常用的java设计模式,代理类与委托类有同样的接口,代 ...

  10. java之静态代理和动态代理

    我们以几个问题,来开始我们今天的学习,如果下面几个问题,你都能说出个一二,那么恭喜你,你已经掌握了这方面的知识.1,什么是代理模式?2,Java中,静态代理与动态代理的区别?3,Spring使用的是J ...

随机推荐

  1. Druid的简介及功能

    Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBoss DataSou ...

  2. centos7 安装R和Rstudio客户端

    #官网下载R和Rstudio 我下载的是 R-3.2.1.tar.gz和rstudio-0.99.467-x86_64.rpm两个版本 rstudio没有看见有centos版的,下的这个RStudio ...

  3. cpsr当前程序状态寄存器

    详解CPSR寄存器(ls_core) (2012-10-11 17:29:47) 转载▼ 标签: arm920t寄存器 cpsr cpu工作原理 分类: 第四章-踏入嵌入式领域之ARM 在介绍CPSR ...

  4. 1.1.1.持久化存储协调器(Core Data 应用程序实践指南)

    持久化存储协调器(persistent store coordinator)里面包含一份持久化存储区,而存储区里又含有数据表里的若干行数据. 与原子存储不同,SQLite数据库会在用户提交变更日志时进 ...

  5. php sprintf函数

    定义和用法 sprintf() 函数把格式化的字符串写写入一个变量中.sprintf(format,arg1,arg2,arg++) 参数 描述 format 必需.转换格式. arg1 必需.规定插 ...

  6. P2P之UDP穿透NAT的原理与实现

    首先先介绍一些基本概念: NAT(Network Address Translators),网络地址转换:网络地址转换是在IP地址日益缺乏的情况下产生的,它的主要目的就是为了能够地址重用.NAT分为两 ...

  7. JDK中的插入排序

    算法 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法--插入排序法,插入排序的基本操作就是将一个数据插入到已经排好 ...

  8. 基于Flex的HTTPService(GET和POST)

    一.基于GET的HTTPService: <?xml version="1.0" encoding="utf-8"?><mx:Applicat ...

  9. 6.00.1x Introduction to computation

    6.00 Introduction to Computer Science                  and  Programming • Goal: –Become skillful at ...

  10. C++:C语言实现HTTP的GET和POST请求

    HTTP请求和IP/TCP 所谓的HTTP协议是基于IP/TCP协议的, 所以要获取远端的html数据只要创建socket对象就足够了: HTTP是基于IP/TCP加上了网络请求的固定格式, 比如: ...