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

静态代理在感觉上和装饰设计模式很像

  1)、在代理类中实现被代理类实现的所有接口,这样保证了被代理类所能实现的方法,代理类也能实现,保证了两边行为的一致性,代理类就能转型为被代理类,当作被代理类处理。而代理中有被代理类的对象,这样,在代理类的内部实现接口方法时就能调用被代理类的方法,从而进行对被代理类的封装。

简单的示范:

package cn.edu.cjl;

public interface Subject {
public void replace();
}

  

package cn.edu.cjl;

public class RealSubject implements Subject{

	@Override
public void replace() {
// TODO Auto-generated method stub
System.out.println("real subject...");
} }

  

package cn.edu.cjl;

public class daili implements Subject {
RealSubject subject;
@Override
public void replace() {
System.out.println("before...");
if(subject==null){
subject=new RealSubject();
}
subject.replace();
System.out.println("after...");
} }

  

package cn.edu.cjl;

public class Client {
public static void main(String[] args) {
Subject subject=new daili();
subject.replace();
}
}

 代码中定义接口Subject,真实的实现类是RealSubject,但是在在主方法中调用的是daili类,在daili类中同样实现了Subject接口,但是真实上调用的是RealSubject类的方法。这就是静态代理。

  静态代理可以解决直接访问类方法带来的问题,但是本身也有问题,就是当大量的使用静态代理时类的个数将双倍的增加,不利于程序的管理。

动态代理使用了反射技术,一个代理类可以为任意类提供代理。

  代理类必须实现InvocationHandler接口,对代理实例调用方法时,将对方法调用进行编码并将其指派到它的代理程序的 invoke 方法。

  invoke方法运用反射技术,通过java.lang.reflect.Proxy类中提供的静态方法 newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)  返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序,也就是代理类实现的InvocationHandler接口中的invoke方法中,这个方法的各个参数的意思是

ClassLoader loader:类加载器,定义代理类的类加载器,可以任意指定。

Class<?>[] interfaces: 被代理类所实现的所有接口的class数组,可以用class对象的getInterfaces()方法得到。

InvocationHandler h:实现了InvocationHandler接口的对象。

简单的事例:

package cn.edu.cjl.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class proxy implements InvocationHandler {
private Object object;
public proxy(Object obj){
this.object=obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("before");
Object resultObject= method.invoke(object, args);
System.out.println("after");
return resultObject;
} }

  

package cn.edu.cjl.proxy;

import java.lang.reflect.Proxy;

public class Client {
public static void main(String[] args) {
Subject subject = null;
RealSubject rSubject = new RealSubject();
proxy proxy = new proxy(rSubject);
subject = (Subject) Proxy.newProxyInstance(Client.class
.getClassLoader(), rSubject.getClass().getInterfaces(), proxy);
subject.replace();
}
}

  

java中的静态代理和动态代理,入门整理的更多相关文章

  1. Java中的反射机制和动态代理

    一.反射概述 反射机制指的是Java在运行时候有一种自观的能力,能够了解自身的情况为下一步做准备,其想表达的意思就是:在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法:对于任意一个对象 ...

  2. 【Java基础】java中的反射机制与动态代理

    一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...

  3. java中的静态分派和动态分派

    多态是java的基本特征之一,多态即一个对象具有多种形态(多种表达形式,猴子是动物的一种的表现形式),例如:子类是父类的一种形态. 当方法重载时,就会涉及到多态. 1:在重载时是通过参数的静态类型,而 ...

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

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

  5. 017 Java中的静态代理、JDK动态代理、cglib动态代理

    一.静态代理 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. 静态代理由业务实现类.业务代理类两部分组成.业务实现类负责实现主要的业务方法,业 ...

  6. java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总

    若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的. 通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. ...

  7. java中静态代理和动态代理

    一.概述 代理是一种模式,提供了对目标对象的间接访问方式,即通过代理访问目标对象.如此便于在目标实现的基础上增加额外的功能操作,前拦截,后拦截等,以满足自身的业务需求,同时代理模式便于扩展目标对象功能 ...

  8. 一篇文章让你搞懂Java中的静态代理和动态代理

    什么是代理模式 代理模式是常用的java设计模式,在Java中我们通常会通过new一个对象再调用其对应的方法来访问我们需要的服务.代理模式则是通过创建代理类(proxy)的方式间接地来访问我们需要的服 ...

  9. Java中的代理模式--静态代理和动态代理本质理解

    代理模式定义:为其他对象提供了一种代理以控制对这个对象的访问. 代理模式的三种角色: Subject抽象主题角色:抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求. Real ...

随机推荐

  1. CentOS 7 x64 docker 使用点滴

    CentOS 7 安装 docker yum search docker  查看是否 有docker包 yum info docker  版本为1.3.2 yum -y install docker ...

  2. linux iptables 相关设置

    首先在使用iptables之前敲入一下两条命令 > iptables -F   #这句话的意思是清空所有的链 > iptables -X  #这句话的意思是清空所有自定义的链 以上两条的含 ...

  3. 链接器工具错误 LNK1123

    由于新学C++变成,找不到人求教,所以这个问题困扰了我很久,今天终于找到终极解决方案了: 出处,此帖25楼: http://bbs.csdn.net/topics/390121452 终极解决方案:V ...

  4. express4.x中路由中间件和挂载路径的关系

    express4.x 中一个路由中间件可以挂载到多个路由上,一个路由也可以绑定多个路由中间件,如: //多个路由匹配一个路由中间件 app.use(['/gre+t', '/hel{2}o'], gr ...

  5. SecureCRT上传bash: rz: command not found

    SecureCRT上传bash: rz: command not found -bash: rz: command not found rz命令没找到? 执行sz,同样也没找到.     安装lrzs ...

  6. K-means算法简介

    K-means 算法是无监督的 聚类算法,算法简单,有效. K-means算法: 输入参数: 指定聚类数目 k,训练集 X 输出 : k 个聚类 算法描述: K-means 算法 是一个 迭代算法,每 ...

  7. CodeForces 625D Finals in arithmetic

    神奇的构造题,我的思路比较奇葩.搞了好久,看到WA on 91我绝望了,然后自己造数据,找到了错误,总算是AC了,现在是凌晨0:24分,看到AC之后,感动China! 我写的代码无比的长.....应该 ...

  8. D. PolandBall and Polygon BIT + 欧拉公式

    http://codeforces.com/contest/755/problem/D // 我也觉得非平面图不能用欧拉公式,但是也能过,不知道为什么.求大佬留言. 这题其实就是平面图,因为它有很多个 ...

  9. html元素被隐藏在后面

    当有些html元素是由于某些控件生成的,然后它被隐藏在其他元素的后面,但是它一开始是隐藏的,你无法直接在html或js里修改它的属性:z-index,使其可以放在更前面,这时可以在css里重新定义控件 ...

  10. STM32+NRF24L01无线(转)

    源:STM32+NRF24L01无线 硬件SPI和模拟SPI源码: nrf24发送(模拟SPI)BHS-STM32.rar nrf24接收(模拟SPI)BHS-STM32.rar nrf24发送(硬件 ...