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

好久不见. 提交于 2019-12-20 06:59:29

夜光序言:

 

 

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

 

 

 

 

 

 

 

 

 

 

正文:

                           以道御术 / 以术识道

 

 

 

 

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

    }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!