- 浏览: 11586 次
- 性别:
- 来自: 南京
最新评论
代理模式: 为其他对象提供一种代理,并以控制对这个对象的访问。
代理模式的作用是:为其它对象提供一种代理以控制对这个对象的访问。在某些情况下,一 个客户不想直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介作用。 代理模式一般涉及到三个角色:
抽象角色:声明真实对象和代理对象的共同接口
代理角色:代理对象内部包含有真实角色的引用,从而可以操作真实角色,同时代理对象 与真实对象有相同的接口,能在任何时候代替真实对象,同时代理对象可以在执行真实对 象前后加入特定的逻辑以实现功能的扩展。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象
代理模式实例:
//抽象角色
public interface Subject {
public void dosomething();
}
//真实角色
public class RealSubject implements Subject {
@Override
public void dosomething() {
System.out.println("do real thing");
}
}
//代理角色
public class ProxySubject implements Subject {
private Subject subject;
public ProxySubject(Subject subject) {
this.subject = subject;
}
@Override
public void dosomething() {
preDoRealThing();
subject.dosomething();
afterDoRealThing();
}
private void preDoRealThing() {
System.out.println("pre do real thing");
}
private void afterDoRealThing() {
System.out.println("after do real thing");
}
public static void main(String[] args) {
Subject realSubject = new RealSubject();
Subject proxySubject = new ProxySubject(realSubject);
proxySubject.dosomething();
}
}
jdk动态代理
jdk动态代理类位于java.lang.reflect包下,一般主要涉及到以下两个类:
Interface InvocationHandler:改接口只定义了一个方法
public Object inveke(Object proxy, Method method, Object[] args)这个抽象方法在代理类中动态实现,proxy一般是指代理类,method代表代理的方法,args代表该方法的参数数组
proxy:动态代理类
protected Proxy(InvocationHandler h):构造函数,估计用于给内部的h赋值。
static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个 代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。
static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用 (可使用被代理类的在Subject接口中声明过的方法)。loader代表代理类的类加载器,interface代表代理类实现的接口,h代表代理类处理器
//抽象角色
public interface Subject {
public void dosomething();
}
//真实角色
public class RealSubject implements Subject {
@Override
public void dosomething() {
System.out.println("do real thing");
}
}
//代理处理器
public class ProxyInvocationHandler implements InvocationHandler {
Object subject;
public ProxyInvocationHandler(Object subject) {
this.subject = subject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("before calling:" + method);
method.invoke(subject, args);
System.out.println("after calling:" + method);
return null;
}
}
//代理角色
public class DynamicProxy {
public static void main(String[] args) {
Subject realSubject = new RealSubject();
InvocationHandler invocationHandler = new ProxyInvocationHandler(realSubject);
Subject proxySubject = (Subject)Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), invocationHandler);
proxySubject.dosomething();
}
}
JDK中的动态代理是通过反射类Proxy以及InvocationHandler回调接口实现的。但是,JDK中所要进行动态代理的类必须要实现一个接口,也就是说只能对该类所实现接口中定义的方法进行代理,这在实际编程中具有一定的局限性,而且使用反射的效率也并不是很高。
使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,比使用Java反射效率要高。唯一需要注意的是,CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类。
代理模式的作用是:为其它对象提供一种代理以控制对这个对象的访问。在某些情况下,一 个客户不想直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介作用。 代理模式一般涉及到三个角色:
抽象角色:声明真实对象和代理对象的共同接口
代理角色:代理对象内部包含有真实角色的引用,从而可以操作真实角色,同时代理对象 与真实对象有相同的接口,能在任何时候代替真实对象,同时代理对象可以在执行真实对 象前后加入特定的逻辑以实现功能的扩展。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象
代理模式实例:
//抽象角色
public interface Subject {
public void dosomething();
}
//真实角色
public class RealSubject implements Subject {
@Override
public void dosomething() {
System.out.println("do real thing");
}
}
//代理角色
public class ProxySubject implements Subject {
private Subject subject;
public ProxySubject(Subject subject) {
this.subject = subject;
}
@Override
public void dosomething() {
preDoRealThing();
subject.dosomething();
afterDoRealThing();
}
private void preDoRealThing() {
System.out.println("pre do real thing");
}
private void afterDoRealThing() {
System.out.println("after do real thing");
}
public static void main(String[] args) {
Subject realSubject = new RealSubject();
Subject proxySubject = new ProxySubject(realSubject);
proxySubject.dosomething();
}
}
jdk动态代理
jdk动态代理类位于java.lang.reflect包下,一般主要涉及到以下两个类:
Interface InvocationHandler:改接口只定义了一个方法
public Object inveke(Object proxy, Method method, Object[] args)这个抽象方法在代理类中动态实现,proxy一般是指代理类,method代表代理的方法,args代表该方法的参数数组
proxy:动态代理类
protected Proxy(InvocationHandler h):构造函数,估计用于给内部的h赋值。
static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个 代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。
static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用 (可使用被代理类的在Subject接口中声明过的方法)。loader代表代理类的类加载器,interface代表代理类实现的接口,h代表代理类处理器
//抽象角色
public interface Subject {
public void dosomething();
}
//真实角色
public class RealSubject implements Subject {
@Override
public void dosomething() {
System.out.println("do real thing");
}
}
//代理处理器
public class ProxyInvocationHandler implements InvocationHandler {
Object subject;
public ProxyInvocationHandler(Object subject) {
this.subject = subject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("before calling:" + method);
method.invoke(subject, args);
System.out.println("after calling:" + method);
return null;
}
}
//代理角色
public class DynamicProxy {
public static void main(String[] args) {
Subject realSubject = new RealSubject();
InvocationHandler invocationHandler = new ProxyInvocationHandler(realSubject);
Subject proxySubject = (Subject)Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), invocationHandler);
proxySubject.dosomething();
}
}
JDK中的动态代理是通过反射类Proxy以及InvocationHandler回调接口实现的。但是,JDK中所要进行动态代理的类必须要实现一个接口,也就是说只能对该类所实现接口中定义的方法进行代理,这在实际编程中具有一定的局限性,而且使用反射的效率也并不是很高。
使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,比使用Java反射效率要高。唯一需要注意的是,CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类。
发表评论
-
Java中的四种引用
2018-03-22 15:12 4371、强引用(Strong Referen ... -
java中try、catch、finally中含有return的简单总结
2017-06-01 14:24 516try语句在返回前,将其他所有的操作执行完,保留好要返回的值 ... -
java泛型总结
2016-04-20 13:26 331泛型(generic):是指参数化类型的能力。可以定义泛型类 ... -
对象的序列化与反序列化
2016-04-18 10:22 451序列化:把对象转换为字节序列的过程 反序列化:把字节序列恢 ... -
覆盖hashCode方法
2016-04-15 13:44 547覆盖hashCode方法规约: ... -
通用equals方法
2016-04-14 17:50 4631.1 equals方法 覆盖equals方法必须遵守的 ... -
java对象的创建建议
2016-04-14 16:39 3181.1 考虑用静态工厂方法代替构造器 示例: publi ... -
枚举类型
2016-04-06 15:50 01.1 基本enum特性 public e ... -
String深入理解
2016-04-05 15:33 411String对象是不可变的,每个看起来会修改String对象 ... -
java内部类详解
2016-04-01 15:59 421内部类 可以将一个类 ... -
理解java中的抽象类与接口
2016-03-31 21:42 400抽象方法:仅有声明没 ... -
面向对象四大基本特征
2016-03-31 14:48 394抽象: 抽象就是找出一 ... -
java回调机制
2016-03-31 09:56 375所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调 ... -
java继承与多态
2016-03-30 11:33 468继承 在java中使用extends ... -
final和static浅析
2016-03-30 10:47 258final 通常代表“这是无法改变的”。 一般使用到final ... -
java数据存储
2016-03-28 22:42 306Java中数据存储区域包括: 1.寄存器:最快的存储区,由编 ... -
java访问控制权限
2016-03-28 22:34 338java访问控制权限:private,protected,包 ... -
java基本类型
2016-03-28 22:31 281基本类型 java确定了每种基本类型的存储空间大小 基本类型 ... -
Java7语法新特性
2016-03-11 15:17 269转自:http://uuhorse.iteye.com/blo ...
相关推荐
JDK动态代理,关于jdk动态代理的问题!详细的说明!JDK动态代理JDK动态代理
动态代理是使用jdk的反射机制,创建对象的能力, 创建的是代理类的对象。 而不用你创建类文件。不用写java文件。 动态:在程序执行时,调用jdk提供的方法才能创建代理类的对象。jdk动态代理,必须有接口,目标类必须...
对jdk中的动态代理执行过程进行了详细跟踪,并反编译了动态代理调用自动生成的代理类,并对其进行了详细讲解。
JDK动态代理源码下载,动态产生代理,实现对【不同类】,【不同方法】的代理
jdk动态代理技术详解,可以学习一下,不错的
通过一个简单例子来理解JDK动态代理的思想,资源为拷贝的视频讲解的内容。
Jdk动态代理,基于接口的代理示例 InovactionHandler Proxy
java jdk 动态代理 演示demo
AOP之JDK动态代理和CGLib动态代理 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45195383
模拟JDK动态代理内部实现
NULL 博文链接:https://jummy.iteye.com/blog/255628
spring aop jdk 动态代理的底层实现解析模拟
JDK动态代理proxy的基本工作原理代码!!
* * * * JDK动态代理 JDK动态代理 JDK动态代理是通过java.lang.reflect.Proxy 类来实现的,我们可以调用Proxy类的newProxyInstance()方法来创建代理对象。对于使用业务接口的类,Spring默认会使用JDK动态代理来实现...
java代理机制 JDK动态代理和cglib代理 详解
java jdk 动态代理演示demo
java静态代理 jdk动态代理 cglib动态代理 代理原理
JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)
基于java的jdk动态代理, 比较了静态代理与动态代理的区别,以及动态代理的底层实现,反编译class文件 jdk动态代理和cglib的区别
模拟JDK动态代理