Java动态代理初识
package d9_proxy; /** * FileName: Test * Author: lps * Date: 2022/4/26 13:02 * Sign:刘品水 Q:1944900433 * 学习开发一个动态代理对象出来 理解动态代理执行流程 */ public class Test { public static void main(String[] args) { //创建一个对象 对象的类必须实现接口 star s = new star("张伟"); Skill s2 = StarAgentProxy.getProxy(s); s2.jump(); s2.sing(); } }
package d9_proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * FileName: StarAgent * Author: lps * Date: 2022/4/26 13:12 * Sign:刘品水 Q:1944900433 */ public class StarAgentProxy { /** * 设计一个方法返回一个明星对象的代理对象 * static Object newProxyInstance(ClassLoader loader, * Class<?>[] interfaces,对象的实现接口列表 * InvocationHandler h) * 返回指定接口的代理实例,该代理实例将方法调用分派给指定的调用处理程序。 */ public static Skill getProxy(star s) { //为star这个对象生成代理对象 return (Skill) Proxy.newProxyInstance(s.getClass().getClassLoader(), s.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("请掏出首付"); Object rs = method.invoke(s, args); //method正在调用方法对象 args代表这个方法的参数 System.out.println("收尾款 接回star"); return rs; } }); } }
package d9_proxy; /** * FileName: star * Author: lps * Date: 2022/4/26 13:03 * Sign:刘品水 Q:1944900433 */ public class star implements Skill { private String name; public star() { } public star(String name) { this.name = name; } @Override public void jump() { System.out.println(name + "开始跳舞"); } @Override public void sing() { System.out.println(name + "开始唱歌"); } }
package d9_proxy; /** * FileName: Skill * Author: lps * Date: 2022/4/26 13:03 * Sign:刘品水 Q:1944900433 */ public interface Skill { void jump();//跳 void sing();//唱 }