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

简介: 静态代理: ISubject: /** * @author com.tiantian * @version 创建时间:2012-11-20 下午1:49:29 */ public interface ISubject { public void request(); } RealSubject(真实角色): /** * @author com.

静态代理:

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();
        
    }
}

 

 

 

相关文章
|
20天前
|
Java
JAVA 静态代理 & 动态代理
【11月更文挑战第14天】静态代理是一种简单的代理模式实现,其中代理类和被代理类的关系在编译时已确定。代理类实现与被代理类相同的接口,并持有被代理类的实例,通过调用其方法实现功能增强。优点包括代码结构清晰,易于理解和实现;缺点是对于多个被代理类,需为每个类编写相应的代理类,导致代码量大增,维护成本高。动态代理则在运行时动态生成代理类,更加灵活,减少了代码冗余,但可能引入性能损耗和兼容性问题。
|
2月前
|
设计模式 Java API
[Java]静态代理与动态代理(基于JDK1.8)
本文介绍了代理模式及其分类,包括静态代理和动态代理。静态代理分为面向接口和面向继承两种形式,分别通过手动创建代理类实现;动态代理则利用反射技术,在运行时动态创建代理对象,分为JDK动态代理和Cglib动态代理。文中通过具体代码示例详细讲解了各种代理模式的实现方式和应用场景。
30 0
[Java]静态代理与动态代理(基于JDK1.8)
|
2月前
|
Java
Java访问外网图片地址时,如何添加代理?
【10月更文挑战第14天】Java访问外网图片地址时,如何添加代理?
37 2
|
2月前
|
Java
Java代码解释静态代理和动态代理的区别
### 静态代理与动态代理简介 **静态代理**:代理类在编译时已确定,目标对象和代理对象都实现同一接口。代理类包含对目标对象的引用,并在调用方法时添加额外操作。 **动态代理**:利用Java反射机制在运行时生成代理类,更加灵活。通过`Proxy`类和`InvocationHandler`接口实现,无需提前知道接口的具体实现细节。 示例代码展示了两种代理方式的实现,静态代理需要手动创建代理对象,而动态代理通过反射机制自动创建。
|
6月前
|
设计模式 Java 程序员
java动态代理(JDK和cglib)
java动态代理(JDK和cglib)
31 0
|
6月前
|
设计模式 Java 程序员
java动态代理(JDK和cglib)
java动态代理(JDK和cglib)
41 0
|
设计模式 Java 数据安全/隐私保护
剖析代理模式及Java两种动态代理(JDK动态代理和CGLIB动态代理)
本文详述了代理模式以及我们经常接触到的两种具体实现(JDK动态代理和CGLIB动态代理),为读者理解代理模式、JDK动态代理和CGLIB动态代理提供帮助
200 0
剖析代理模式及Java两种动态代理(JDK动态代理和CGLIB动态代理)
|
设计模式 Java 数据库连接
Java 动态代理机制 (一) JDK Proxy详解
JDK Proxy 代理是可以根据我们的 接口 Interface 生成类的字节码,从而可以在 Java 中为所欲为的一种技术,包括对象增强(修改成员变量),函数增强(在函数前后执行别的代码),根据接口名执行不同逻辑 等。在 Mybatis 中有典型应用。它的本质是 由 Proxy 生成一个 代理对象,实现我们的接口。这个对象中有我们的回调函数。当调用 代理对象的接口方法时,这个对象再调用我们的回调函数,我们的回调函数再调用原对象的对应方法。从而实现代理。为了实现代理模式,Proxy 用了另外一种设计模式:命令模式。 不过,如果我们没有接口,直接是个类,那么 Proxy 将不能用,我们可能需
|
Java
Java动态代理模式jdk和cglib(上)
Java动态代理模式jdk和cglib(上)
114 0
Java动态代理模式jdk和cglib(上)
|
Java 数据库连接 Spring
Java动态代理模式jdk和cglib(下)
Java动态代理模式jdk和cglib(下)
81 0