java 代理模式(静态代理+动态代理)

简介:
随笔- 137  文章- 6  评论- 145 

java 代理模式(静态代理+动态代理)

静态代理:

ISubject:

复制代码
/**
 * @author com.tiantian
 * @version 创建时间:2012-11-20 下午1:49:29
 */
public interface ISubject {
    public void request();
}
复制代码

RealSubject(真实角色):

复制代码
/**
 * @author com.tiantian
 * @version 创建时间:2012-11-20 下午1:51:37
 */
public class RealSubject implements ISubject{

    @Override
    public void request() {
        System.out.println("realSubject requesting");
    }
}
复制代码

ProxySubject(代理类):

复制代码
/**
 * @author com.tiantian
 * @version 创建时间:2012-11-20 下午1:52:22
 */
public class ProxySubject implements ISubject{
    private RealSubject realSubject;
    public ProxySubject() {
        realSubject = new RealSubject();
    }

    @Override
    public void request() {
        System.out.println("do something before");
        realSubject.request();
        System.out.println("do something after");
    }
}
复制代码

Test(客户端测试):

复制代码
/**
 * @author com.tiantian
 * @version 创建时间:2012-11-20 下午1:54:47
 */
public class Test {
    public static void main(String[] args) {
        ISubject proxySubject = new ProxySubject();
        proxySubject.request();
    }
}
复制代码

------------------------------------------------------------------------------------------------------------------------------

动态代理:

ISubject:

复制代码
/**
 * @author com.tiantian
 * @version 创建时间:2012-11-20 下午2:51:31
 */
public interface ISubject {
    public void request();
}
复制代码

RealSubject:

复制代码
/**
 * @author com.tiantian
 * @version 创建时间:2012-11-20 下午2:52:00
 */
public class RealSubject implements ISubject{

    @Override
    public void request() {
        System.out.println("realSubject requesting");
    }
}
复制代码

SubjectInvocationHandler(调用处理类):

复制代码
/**
 * @author com.tiantian
 * @version 创建时间:2012-11-20 下午2:54:38
 * 调用处理类
 */
public class SubjectInvocationHandler implements InvocationHandler{
    private Object obj;
    
    public SubjectInvocationHandler(Object obj) {
        this.obj = obj;
    }
    
    /**
     * 生成代理类工厂
     * @author com.tiantian
     * @param realObj
     * @return 返回生成的代理类
     */
    public static Object getProxyInstanceFactory(Object realObj){
        Class<?> classType = realObj.getClass();
        return Proxy.newProxyInstance(classType.getClassLoader(), 
                classType.getInterfaces(), new SubjectInvocationHandler(realObj));
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println("before");
        
        method.invoke(obj, args);
        
        System.out.println("after");
        
        return null;
    }
}
复制代码

Test:

复制代码
/**
 * @author com.tiantian
 * @version 创建时间:2012-11-20 下午2:56:25
 */
public class Test {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
//        InvocationHandler handler = new SubjectInvocationHandler(realSubject);
//        ISubject subject = (ISubject)Proxy.newProxyInstance(realSubject.getClass().getClassLoader(),
//                realSubject.getClass().getInterfaces(), handler);
        ISubject subject = (ISubject)SubjectInvocationHandler.getProxyInstanceFactory(realSubject);
        subject.request();
        
    }
}
复制代码

 

本文转自天天_byconan博客园博客,原文链接:http://www.cnblogs.com/tiantianbyconan/archive/2012/11/20/2779095.html,如需转载请自行联系原作者

相关文章
|
6天前
|
设计模式 缓存 算法
Java 的静态代理和动态代理
Java 的静态代理和动态代理
|
7天前
|
设计模式 Java 索引
由反射引出的Java动态代理与静态代理
由反射引出的Java动态代理与静态代理
13 0
|
9天前
|
Java API Spring
Java基础教程(13)-Java中的反射和动态代理
【4月更文挑战第13天】Java反射机制允许程序在运行时获取类的信息并调用其方法。Class类是基础,提供获取类属性和方法的能力。通过Class对象,可以操作实例字段和方法,如getField、getDeclaredField等。动态代理是Java提供的创建接口实例的机制,其中JDK动态代理需目标类实现接口,而Cglib则可代理未实现接口的类。动态代理涉及Proxy和InvocationHandler接口。
|
12天前
|
存储 Java
Java动态转发代理IP的实现方法
Java动态转发代理IP的实现方法
28 11
|
12天前
|
监控 Java 开发者
掌握 Java 反射和动态代理
【4月更文挑战第19天】Java反射和动态代理提供强大功能和灵活性。反射允许运行时检查和操作类,获取类信息、动态调用方法,但可能带来性能损失和降低代码可读性。动态代理则用于创建代理对象,实现透明性和横切关注点分离,常用于日志、权限检查等。两者结合能实现更复杂功能。掌握这些技术能提升代码的灵活性和可扩展性,但也需注意性能和可读性。通过学习和实践,能更好地构建高效软件系统。
|
13天前
|
安全 Java API
java借助代理ip,解决访问api频繁导致ip被禁的问题
java借助代理ip,解决访问api频繁导致ip被禁的问题
|
Java
domino中lotusscprit调用java代理
 Dim sess As New NotesSession Dim db As NotesDatabase Dim agent As NotesAgent Dim doc As NotesDocument  Set db = sess.
884 0
|
1天前
|
缓存 Java 调度
Java并发编程:深入理解线程池
【4月更文挑战第30天】 在Java并发编程中,线程池是一种重要的工具,它可以帮助我们有效地管理线程,提高系统性能。本文将深入探讨Java线程池的工作原理,如何使用它,以及如何根据实际需求选择合适的线程池策略。
|
1天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第30天】 本文将深入探讨Java中的线程池,解析其原理、使用场景以及如何合理地利用线程池提高程序性能。我们将从线程池的基本概念出发,介绍其内部工作机制,然后通过实例演示如何创建和使用线程池。最后,我们将讨论线程池的优缺点以及在实际应用中需要注意的问题。
|
1天前
|
设计模式 算法 安全
Java多线程编程实战:从入门到精通
【4月更文挑战第30天】本文介绍了Java多线程编程的基础,包括线程概念、创建线程(继承`Thread`或实现`Runnable`)、线程生命周期。还讨论了线程同步与锁(同步代码块、`ReentrantLock`)、线程间通信(等待/通知、并发集合)以及实战技巧,如使用线程池、线程安全设计模式和避免死锁。性能优化方面,建议减少锁粒度和使用非阻塞算法。理解这些概念和技术对于编写高效、可靠的多线程程序至关重要。