本文内容
- 1、静态代理示例及相关解释
- 2、动态代理示例及相关解释
一、静态代理示例及相关解释
public interface HelloWorld {
void print(String message);
void say(String message);
}
public class HelloWorldImp implements HelloWorld{
@Override
public void print(String message) {
// TODO Auto-generated method stub
System.out.println("Hello "+message);
}
@Override
public void say(String message) {
// TODO Auto-generated method stub
System.out.println("Say "+message);
}
}
public class StaticProxy implements HelloWorld{
private HelloWorld helloWorld;
public StaticProxy(HelloWorld helloWorld) {
// TODO Auto-generated constructor stub
this.helloWorld = helloWorld;
}
@Override
public void print(String message) {
// TODO Auto-generated method stub
helloWorld.print(message);
}
@Override
public void say(String message) {
// TODO Auto-generated method stub
helloWorld.say(message);
}
}
public class Main {
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorldImp();
StaticProxy staticProxy = new StaticProxy(helloWorld);
staticProxy.print("world");
staticProxy.say("world");
}
}
一些相关解释:
代码中用StaticProxy类来代理HelloWorldImp来处理被代理类的逻辑。但是如果想要处理更多的逻辑呢?这时就要分别在HelloWorld HelloWorldImp以及StaticProxy中添加相应的方法。牵一发而动全身,设计存在一定缺陷。
二、动态代理示例及相关解释
/**
* 实现了业务逻辑的分离 低耦合
* @author Administrator
*
*/
public class MyInvocationHandler implements InvocationHandler {
// 要被代理的对象
private Object object;
/**
* 绑定要被代理额的对象,返回代理对象
*
* @param object
* @return
*/
public Object bindRelation(Object object) {
this.object = object;
Object proxy = Proxy.newProxyInstance(object.getClass()
.getClassLoader(), object.getClass().getInterfaces(), this);
return proxy;
}
/**
* 当拦截这个类接口中的方法的时候被调用 一个过滤的作用 可以添加额外方法
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
// System.out.println("proxy:" + proxy.toString());
System.out.println("事务开始");
Object result = method.invoke(object, args);
System.out.println("事务结束");
return result;
}
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
}
public class Main {
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorldImp();
MyInvocationHandler invocationHandler = new MyInvocationHandler();
HelloWorld proxy = (HelloWorld) invocationHandler
.bindRelation(helloWorld);
proxy.print("world");
proxy.say("hello");
}
}
一些解释:
动态代理主要的作用是对被代理对象调用的方法进行一次处理,在InvotionHandler中的invoke方法中处理。这样我们就可以在inoke中添加各种逻辑而不需要改变HelloWorld HelloWorldImp中的代码了。实现了低耦合。用途很广泛例如Spring中AOP对hibernate的事务处理,权限处理,远程方法调用(RMI)都用到了动态代理。
分享到:
相关推荐
Java提供了两种主要的代理实现方式:静态代理和动态代理。 **静态代理** 静态代理是程序员手动创建代理类并实现与目标对象相同的接口。代理类和目标类都必须实现相同的接口,这样代理类就可以在调用目标对象方法的...
总结来说,Spring的静态代理和动态代理都用于实现AOP,静态代理适用于简单场景,但需要手动编写代理类,而动态代理则更加灵活,可以在运行时动态创建代理对象,适用于接口众多的情况。了解和掌握这两种代理模式对于...
代理设计模式分为静态代理和动态代理两种类型。 ### 静态代理 静态代理是在编译时就已经确定了代理关系,代理类和真实类的关系是硬编码在代理类中的。下面我们将详细介绍静态代理的实现方式: 1. **定义接口**:...
本资源主要涵盖了静态代理和动态代理两种常见类型的代理模式,以及Spring AOP中动态代理的三种配置方式。以下是详细的知识点解析: ### 静态代理 静态代理是程序员手动创建代理类并实现相同接口的方式。代理类和...
在这个“包含静态代理和动态代理demo代码”的压缩包中,我们可能会看到两种常见的Java代理实现方式的示例:静态代理和动态代理。 首先,我们来详细讲解静态代理。在静态代理中,代理类和真实类(目标类)都是在编译...
静态代理和动态代理是两种常见的代理模式,它们在Java中有着广泛的应用,特别是在SpringBoot等框架中。本资源提供了一个简单的Java实现,适用于JDK1.8版本,并经过了验证,对初学者理解设计模式具有指导意义。 静态...
代理模式分为两种主要类型:静态代理和动态代理。 **静态代理** 静态代理是通过程序员手动创建一个代理类来实现的。这个代理类实现了与目标类相同的接口,并且在调用目标方法时添加额外的逻辑。以下是一个简单的...
本教程将深入探讨静态代理和JDK动态代理的概念、工作原理以及如何实现。 ### 静态代理 静态代理是在编译时就确定了代理类和目标类的关系。代理类和目标类通常都需要实现相同的接口,以便于在代理类中调用目标类的...
代理模式可以分为两种主要类型:静态代理和动态代理。这两种代理方式各有特点,广泛应用于软件系统中,如权限控制、缓存、事务管理等场景。 **静态代理** 静态代理是最基础的代理形式,代理类和被代理类在编译时就...
总结来说,静态代理和动态代理都是为了在调用对象方法时添加额外的行为,但静态代理需要预先定义代理类,而动态代理可以在运行时动态创建代理对象。在某些场景下,如接口数量多或频繁变动时,动态代理更具优势,因为...
代理模式通常分为静态代理和动态代理两种类型,这两种代理方式各有特点,适用于不同的场景。 **静态代理** 静态代理是通过程序员手动创建一个代理类来实现的。代理类和真实目标类需要实现相同的接口,以便代理类...
在Java中,代理主要分为静态代理和动态代理。 1. 静态代理: 静态代理是在编译时就已经明确代理类与被代理类关系的一种方式。为了实现静态代理,我们需要手动创建一个代理类,这个代理类通常会实现与被代理类相同的...
Java提供了两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。 - **JDK动态代理**:基于接口的代理,要求被代理的类必须实现至少一个接口。动态代理通过实现`java.lang.reflect.InvocationHandler`接口并...
Java提供了两种主要的代理实现方式:静态代理和动态代理。 ### 静态代理 静态代理是在编译时就已经确定了代理关系。首先,我们需要定义一个接口,比如`Car`,这个接口描述了汽车的行为: ```java public ...
Java中的代理模式--静态代理和动态代理 Java中的代理模式--静态代理和动态代理