一、静态代理
由程序员创建或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。
优点:不依赖于其它的类,实现简单。
缺点:当接口或抽象类添加方法时,需要修改相应的代理类。
Sample:
(1)、定义一个接口或者抽象类,这边定义一个接口
interface HelloWorld{
void say();
}
(2)、实现类
public class HelloWorldImp implements HelloWorld{
public void say(){
System.out.println("Hello,World!");
}
}
(3)、静态代理类
public class HelloWorldProxy implements HelloWorld{
private HelloWorld helloWorld;
public HelloWorldProxy(HelloWorld helloWorld){
this.helloWorld = helloWorld;
}
public void say(){
System.out.println("do something...");
helloWorld.say();
System.out.println("do something...");
}
}
(4)、测试类
public class TestHelloWorldProxy{
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorldImp();
HelloWorldProxy helloWorldProxy = new HelloWorldProxy(helloWorld);
helloWorldProxy.say();
}
}
二、动态代理
1、JDK动态代理
JDK动态代理类的字节码在程序运行时由Java反射机制动态生成
优点:创建代理对象速度快
缺点:执行速度慢,只能对实现接口的类做代理
Sample:
接口及实现类的定义同上。
(3)、JDK动态代理类
class JDKProxy implements InvocationHandler {
private HelloWorld helloWorld;
public JDKProxy(HelloWorld helloWorld) {
this.helloWorld = helloWorld;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("do something ...");
Object result = method.invoke(helloWorld, args);
System.out.println("do something ...");
return result;
}
public Object getProxy() {
return Proxy.newProxyInstance(helloWorld.getClass().getClassLoader(), helloWorld.getClass().getInterfaces(), this);
}
}
(4)、测试类
public class TestJDKProxy{
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorldImp();
JDKProxy handler = new JDKProxy(helloWorld);
HelloWorld proxy = (HelloWorld)handler.getProxy();
proxy.say();
}
}
2、Cglib动态代理
Cglib是针对类来实现代理的,他的原理是对指定的目标类动态生成一个子类,并覆盖其中方法实现增强。
优点:执行速度快
缺点:创建代理对象速度慢,不能代理final类,
Sample:
接口及实现类的定义同上。
(3)、Cglib动态代理类
public class CglibProxy implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] arg, MethodProxy proxy) throws Throwable {
System.out.println("do something ...");
Object result = proxy.invokeSuper(obj, arg);
System.out.println("do something ...");
return result;
}
public Object getInstance(Object target) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
}
(4)、测试类
public class TestCglibProxy{
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorldImp();
CglibProxy interceptor = new CglibProxy();
HelloWorld proxy = (HelloWorld)interceptor.getInstance(helloWorld);
proxy.say();
}
}
分享到:
相关推荐
"Design*Pattern*Framework*4.5" 可能指的是一个基于 .NET Framework 4.5 的设计模式实现或教程集合。 设计模式是经验丰富的软件开发者的智慧结晶,它们被分为三类:创建型、结构型和行为型。创建型模式涉及对象的...
设计模式(Design Pattern)是软件工程中的一种经验总结,它是在特定上下文中为解决常见问题而提出的一套可复用的解决方案。设计模式并不直接实现为代码,而是提供了一种在面向对象设计中如何处理常见问题的指南。...
23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm”供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) 生成...
在本文中,我们将深入探讨设计模式的核心概念,并结合"Head First DesignPattern_src"中的源码,详细解析一些关键的设计模式。 1. 单例模式(Singleton): 单例模式确保一个类只有一个实例,并提供全局访问点。在...
2. 结构型设计模式:包括适配器模式(Adapter)、装饰器模式(Decorator)、代理模式(Proxy)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)和享元模式(Flyweight)。这些模式关注如何将类和...
### Design Pattern 简明手册知识点详述 #### 一、接口型(interface)模式 **1. Adapter(适配器模式)** - **定义**:允许一个类接口与另一个不兼容的类接口协同工作。 - **分类**: - **继承型Adapter**:通过...
aidl是android进行系统间通信的借口描述语言,仔细分析由aidl生成的java类,你会发现code是用的是proxy design pattern,能看到这层就会觉得google的设计其实真的是很巧妙。如果需要在别的package中引用aidl,需要...
8. **代理模式(Proxy)**:为其他对象提供一种代理以控制对这个对象的访问。常用于远程代理、虚拟代理、权限控制等场景。 9. **桥接模式(Bridge)**:将抽象部分与它的实现部分分离,使它们都可以独立地变化。有...
本资源"designpattern.zip"包含了对Java中23种经典设计模式的详细讲解和代码实例,对于中高级Java工程师来说,是提升开发技能的必备学习材料。 设计模式通常分为创建型、结构型和行为型三大类。创建型设计模式关注...
7. **代理模式(Proxy Pattern)**: - 定义:为其他对象提供一种代理以控制对这个对象的访问。 - 应用场景:远程调用、虚拟代理、缓存等。 #### 知识点四:设计模式在Java项目中的应用 1. **提高代码的可维护性...
"DesignPattern.zip"这个压缩包包含了使用C++语言实现的设计模式源代码,适合在Visual Studio 2017环境下编译运行,并且能够方便地移植到Linux平台。下面将对设计模式及其在C++中的应用进行详细阐述。 1. **单例...
"Design Pattern中文版" 提供的是这些经典设计模式的中文解释,使得中国的开发者能够更方便地理解和应用这些模式。这份资料的描述指出字迹清晰,意味着阅读体验良好,适合深入学习。 PDF格式是一种广泛使用的文档...
《Professional ASP.NET Design Pattern》是一本深入探讨ASP.NET开发中设计模式的专业书籍,源代码的提供使得读者能够更直观地理解和应用这些设计模式。源代码的分章节组织(如c07到c14)表明内容可能按照书中的章节...
10. **代理模式(Proxy)**:为其他对象提供一种代理以控制对这个对象的访问。代理模式常用于性能优化、安全控制等场景。 11. **享元模式(Flyweight)**:运用共享技术有效地支持大量细粒度的对象,减少内存占用。...
设计模式(Design Pattern)是软件工程中用于解决软件设计问题的既定方案。设计模式并非直接的代码实现,而是一套被验证过的通用解决方案模板。它们是由经验丰富的软件开发者总结出的,在特定上下文中对常见问题的...
《Design Pattern In C#》是一本深入探讨设计模式的书籍,专为使用C#编程语言的开发者准备。设计模式是软件工程中经过实践验证的、解决常见问题的有效方法,是经验丰富的开发者的智慧结晶。这本书以英文撰写,以其...
6. **Binder原理与核心架构**: Binder是Android系统间通信的基础,课程会详细剖析Binder的核心架构,包括Proxy Design Pattern、.asInterface()的深入解析,Linux Binder驱动的工作原理,以及BpInterface、Proxy ...
7. **代理模式(Proxy)**:代理模式为其他对象提供一种代理以控制对这个对象的访问,通常用于远程代理、虚拟代理和保护代理等。 8. **观察者模式(Observer)**:观察者模式定义了对象之间的一对多依赖关系,当一...