夜光带你走进 Java 成神之路(二十六)擅长的领域

本文深入探讨了代理模式在软件设计中的应用,包括静态代理和动态代理的实现方式,以及如何通过代理模式增强对象的功能,如在方法调用前后添加额外的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

夜光序言:

 

 

你知道,这世界如此寂寞。没有按下的发送键,季风的转向,云雨的流动和鸟的迁徙。以及,没有对你说出口的,再见。

 

 

 

 

 

 

 

 

 

 

正文:

                           以道御术 / 以术识道

 

 

 

 

package 代理模式.静态代理;

//接口
public interface ITeacherDao {

    void teach();  //授课的方法

}
package 代理模式.静态代理;

public class TeacherDao implements ITeacherDao{


    @Override
    public void teach() {
        System.out.println(" 老师授课中.... ");
    }
}

 

package 代理模式.静态代理;

//代理对象,静态代理
public class TeacherDaoProxy implements ITeacherDao{

    //定义一个字段
    private ITeacherDao target;  //目标对象,通过接口来聚合

    //下面写一个构造器
    public TeacherDaoProxy(ITeacherDao target) {
        this.target = target;
    }

    @Override
    public void teach() {
         System.out.println("代理对象开始代理");
         target.teach();
         System.out.println("代理结束");
    }
}
package 代理模式.静态代理;

public class Client {
    public static void main(String[] args) {
        //创建目标对象(被代理对象)
        TeacherDao teacherDao = new TeacherDao();

        //创建代理对象,同时将被代理对象传递给代理对象
        TeacherDaoProxy teacherDaoProxy = new TeacherDaoProxy(teacherDao);

        //通过代理对象,调用到被代理对象的方法
        //即:执行的是代理对象的方法,代理对象再去调用目标对象的方法
        teacherDaoProxy.teach();

    }
}

 

 

 

package 代理模式.动态代理;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyFactory {

    //维护一个目标对象  object类型
    private Object target;

    //我们创建一个构造器  对target进行初始化
    public ProxyFactory(Object target) {
        this.target = target;
    }

    //给目标对象生成一个代理对象
    public Object getProxyInstance(){
        //夜光:说明
        //1. 第一个参数 ClassLoader loader  指定当前目标对象使用的类加载器,获取加载器方法的固定
        //2. Class<?>[] interfaces  目标对象实现的接口类型,使用泛型的方式确认类型
        //3. InvocationHandler h   事件处理,执行目标对象方法时,会触发事件处理方法
        //会把当前执行的目标对象方法作为参数传入
/*        public static Object newProxyInstance(ClassLoader loader,
                Class<?>[] interfaces,
                InvocationHandler h)*/
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("JDK代理开始~~");
                        //反射机制调用目标对象方法
                        Object returnVal = method.invoke(target, args);
                        return returnVal;
                    }
                });
    }


}

 

package 代理模式.动态代理;

//接口
public interface ITeacherDao {

    void teach();  //授课的方法

}

 

package 代理模式.动态代理;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyFactory {

    //维护一个目标对象  object类型
    private Object target;

    //我们创建一个构造器  对target进行初始化
    public ProxyFactory(Object target) {
        this.target = target;
    }

    //给目标对象生成一个代理对象
    public Object getProxyInstance(){
        //夜光:说明
        //1. 第一个参数 ClassLoader loader  指定当前目标对象使用的类加载器,获取加载器方法的固定
        //2. Class<?>[] interfaces  目标对象实现的接口类型,使用泛型的方式确认类型
        //3. InvocationHandler h   事件处理,执行目标对象方法时,会触发事件处理方法
        //会把当前执行的目标对象方法作为参数传入
/*        public static Object newProxyInstance(ClassLoader loader,
                Class<?>[] interfaces,
                InvocationHandler h)*/
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("JDK代理开始~~");
                        //反射机制调用目标对象方法
                        Object returnVal = method.invoke(target, args);
                        return returnVal;
                    }
                });
    }


}

 

package 代理模式.动态代理;



public class TeacherDao implements ITeacherDao{


    @Override
    public void teach() {
        System.out.println(" 老师授课中.... ");
    }
}
package 代理模式.动态代理;

public class Client {

    public static void main(String[] args) {
        //创建目标对象
        ITeacherDao target = new TeacherDao();

        //给目标对象,创建代理对象   可以转换成ITeacherDao
        ITeacherDao proxyInstance = (ITeacherDao)new ProxyFactory(target).getProxyInstance();

        System.out.println(proxyInstance);

    }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值