什么是代理?
生活中的代理:比如我们生活中比较熟悉的代购、中介、商家等都是属于代理.
什么是静态代理?
1)代理类是自己手工实现的,自己创建一个Java类,表示代理类。
2)同时你所要代理的目标是确定的。
静态代理的特点:
1)实现简单
2)容易理解
当目标类和代理类很多的时候,会you以下情况:
1)当目标类增加了,代理类可能也需要成倍的增加,代理类数量过多。
2)当你的接口中功能增加了,或者修改了,会影响众多的实现类,厂家类,代理都需要修改,影响比较多
举个例子:
结婚是需要婚庆公司帮忙做些事情
public class Text_静态代理 { public static void main(String[] args) { // 没有使用静态代理之前 // 接口多态或者是具体类new Mary1 mary = new You1() ; mary.mary(); System.out.println("-----------------------------"); // 使用静态代理 You1 you = new You1() ; // 创建代理角色 Weddinggs weddinggs = new Weddinggs(you); weddinggs.mary(); } } //定义一个结婚的接口 interface Mary1{ void mary() ; } //每个人都要结婚 class You1 implements Mary1{//真实角色 @Override public void mary() { System.out.println("这不是正在结婚呢嘛"); } } // 婚庆公司==代理角色 class Weddinggs implements Mary1{ //声明一个接口Mary类型变量 private Mary1 mary; public Weddinggs(Mary1 mary){ this.mary=mary ; } public void mary(){ System.out.println("结婚前需要布置场地"); mary.mary(); System.out.println("结婚后需要交付尾款"); } }
输出结果为:
什么是动态代理?
在代码程序执行过程中,使用jdk的反射机制,创建代理类对象,并动态的指定要代理目标类(静态代理中,代理对象是固定的)。而不用创建类文件,不用写Java文件。
动态代理是在jdk运行期间,动态的创建class字节码并加载到JVM执行
换句话说,动态代理是一种创建Java对象的能力,让你不用创建TaoBao类,就能创建代理类对象。一般创建对象是 new Xx(),那现在动态代理也可以做这个事情。
举个例子:
package com.qf.proxy; import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class Test_动态代理 { public static void main(String[] args) { Userdiaoimpl userdiaoimpl = new Userdiaoimpl(); userdiaoimpl.add(); userdiaoimpl.delete(); userdiaoimpl.select(); userdiaoimpl.update(); System.out.println("------------------------------"); Userdiaoimpl2 ud2 = new Userdiaoimpl2(); ud2.add(); ud2.delete(); ud2.update(); ud2.select(); System.out.println("-------------下面是动态代理---------------"); Mydtdl mydtdl = new Mydtdl(ud2); Userdiao proxyInstance = (Userdiao) Proxy.newProxyInstance( ud2.getClass().getClassLoader(), ud2.getClass().getInterfaces(), mydtdl ); proxyInstance.add(); proxyInstance.delete(); proxyInstance.select(); proxyInstance.update(); } } interface Userdiao{ void add();//增 void delete();//删 void update();//改 void select();//查 } class Mydtdl implements InvocationHandler{ private Object target; public Mydtdl (Object target){ this.target= target ; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("动态:第一步先检查一下"); Object invoke = method.invoke(target ,args); System.out.println("动态:第三步在打印个啥"); return invoke; } } class Userdiaoimpl2 implements Userdiao{ @Override public void add() { System.out.println("第一步先检查一下"); System.out.println("第二步直接增加"); System.out.println("第三步在打印个啥"); } @Override public void delete() { System.out.println("第一步先检查一下"); System.out.println("第二步直接删除"); System.out.println("第三步在打印个啥"); } @Override public void update() { System.out.println("第一步先检查一下"); System.out.println("第二步直接修改"); System.out.println("第三步在打印个啥"); } @Override public void select() { System.out.println("第一步先检查一下"); System.out.println("第二步直接查询"); System.out.println("第三步在打印个啥"); } } class Userdiaoimpl implements Userdiao{ @Override public void add() { System.out.println("增加"); } @Override public void delete() { System.out.println("删除"); } @Override public void update() { System.out.println("修改"); } @Override public void select() { System.out.println("查询"); } }
输出结果为: