本文内容
- 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静态代理和动态代理
静态代理和动态代理的讲解和案例,有详细的注释
Java设计模式——代理设计模式(静态代理和动态代理) 各种情况例子源码
此资源为文章中《代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)》与《 AOP动态代理声明式的3种配置方式过程与区别》的案例代码,可下载参考学习。
Java静态代理和动态代理
在代理模式中,主要有两种类型:静态代理和动态代理。 1.静态代理: 静态代理是指在编译期间就已经确定代理类和被代理类的关系,需要手动编写代理类。代理类需要实现与被代理类相同的接口,并且在代理类中持有一个被...
包含静态代理和动态代理demo代码
NULL 博文链接:https://daxiaoli123.iteye.com/blog/940784
资源列举了设计模式中的静态代理和动态代理的简单java实现,jdk1.8版本经过测试验证,对于想学习设计模式的童靴应该有所帮助
静态代理和动态代理简单实现代码.Proxy.其中静态代理我写了两个demo,有一个是最原始的,还有一个放在程杰的大化设计模式的代理模式写的,纯属娱乐。
Java中的代理模式--静态代理和动态代理 Java中的代理模式--静态代理和动态代理
Spring专题与案例 Spring代理 静态代理和动态代理 Spring专题与案例-代理(静态和动态) Spring专题与案例-代理(静态和动态)
利用一个Car接口详细介绍了静态代理技术和JDK动态动态代理技术