动态代理
- 代理模式
代理(Proxy)是一种设计模式,提供了目标对象另外的访问方式,就是通过代理对象访问目标对象。
这样的好处是可以给目标对象扩展功能。
这里使用到的编程思想:不要随意去修改别人的已经写好的代码或者方法,如果需要修改那么使用代理方式来扩展改方法。
举个例子:我们要请明星拍广告,我们不可能直接去和明星说,而是找经纪人来告诉他拍广告的事情。
明星只负责表演,其余的事情都是经济人来搞。用图来表示:
代理模式的关键点就是:代理对象与目标对象.代理对象是对目标对象的扩展,并且会调用目标对象。
实例场景:我想为谷歌汽车增加功能
定义一个汽车接口:
package com.itheima.car; public interface Goodle { public void start(); //汽车工作 public void run(); //汽车运行 public void stop(); // 汽车停止 }
实现接口里所有的方法:
package com.itheima.car; public final class Car implements Goodle { @Override public void start() { // TODO Auto-generated method stub System.out.println("汽车工作"); } @Override public void run() { // TODO Auto-generated method stub System.out.println("汽车运行"); } @Override public void stop() { // TODO Auto-generated method stub System.out.println("汽车停止"); } }
主方法:
package com.itheima.Test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import com.itheima.car.Car; import com.itheima.car.Goodle; public class Test { public static void main(String[] args) { Goodle car= (Goodle) Proxy.newProxyInstance(Test.class.getClassLoader(), Car.class.getInterfaces(),new InvocationHandler() { //目标实现了的接口 本类的加载器固定的 目标对象获取已经实现的接口中的方法 匿名对象 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub if (method.getName().equalsIgnoreCase("start")) { //判断是不是start方法,如果是那么就添加检查天气功能和检查路况的功能 System.out.println("检查天气"); method.invoke(new Car(), args); System.out.println("检查路况"); }else { method.invoke(new Car(), args); } return null; } } ); car.start(); car.run(); car.stop(); } }
增加功能就实现了:
你不会的东西,觉得难的东西,一定不要躲。先搞明白,后精湛,你就比别人优秀了。因为大部分人都不舍得花力气去钻研,自动淘汰,所以你执着的努力,就占了大便宜。奋斗就是每一天都很难,可一年比一年容易。不奋斗就是每一天都很容易,可一年比一年越难。怕吃苦的人吃苦一辈子,不怕吃苦的人吃苦一阵子。拼一个春夏秋冬,赢一个无悔人生