diff --git a/javaSE-day13/src/com/inmind/proxy01/CaiXuKun.java b/javaSE-day13/src/com/inmind/proxy01/CaiXuKun.java new file mode 100644 index 0000000..2b09968 --- /dev/null +++ b/javaSE-day13/src/com/inmind/proxy01/CaiXuKun.java @@ -0,0 +1,18 @@ +package com.inmind.proxy01; + +public class CaiXuKun implements Singer{ + @Override + public void sing(int money) { + System.out.println("蔡徐坤收到"+money+"钱,唱了鸡你太美"); + } + + @Override + public void dance(int money) { + System.out.println("蔡徐坤收到"+money+"钱,跳了篮球舞"); + } + + @Override + public void eat() { + System.out.println("蔡徐坤吃了大盘鸡"); + } +} diff --git a/javaSE-day13/src/com/inmind/proxy01/Demo01.java b/javaSE-day13/src/com/inmind/proxy01/Demo01.java new file mode 100644 index 0000000..ed17118 --- /dev/null +++ b/javaSE-day13/src/com/inmind/proxy01/Demo01.java @@ -0,0 +1,17 @@ +package com.inmind.proxy01; +/* +反射的前提:Class对象 +类加载器:能够将字节码文件(.class文件)加载到JVM的方法区,就在堆内存中产生一一对应的Class对象. +类加载器的作用:生成Class对象 + +应用场景:在动态代理的api中,它要作为参数. + */ +public class Demo01 { + public static void main(String[] args) { + //反射的前提:Class对象 + Class clazz = Demo01.class; + //获取Class的加载器 + ClassLoader classLoader = clazz.getClassLoader(); + System.out.println(classLoader); + } +} diff --git a/javaSE-day13/src/com/inmind/proxy01/Demo02.java b/javaSE-day13/src/com/inmind/proxy01/Demo02.java new file mode 100644 index 0000000..0471329 --- /dev/null +++ b/javaSE-day13/src/com/inmind/proxy01/Demo02.java @@ -0,0 +1,30 @@ +package com.inmind.proxy01; +/* +静态代理 +装饰设计模式: + 装饰者 被装饰者 作用:装饰者增强了被装饰者的功能 + 花瓶 花 花瓶增强了花的好看的程度 + 经纪人(JingJiRen) 歌手(CaiXuKun) 经纪人增强了蔡徐坤的经济价值 + + 装饰设计模式的前提: 装饰者需要与被装饰者的功能要一致,继承同一个父类或者实现同一个接口 + BufferedReader FileReader 字符缓冲输入流增加了一个8192数组增强了字符输入流的读取的效率 + */ +public class Demo02 { + public static void main(String[] args) { + CaiXuKun caiXuKun = new CaiXuKun(); + caiXuKun.sing(10); + caiXuKun.dance(10); + caiXuKun.eat(); + System.out.println("----------------------"); + /* + 蔡徐坤火了 + 需求:蔡徐坤的类的功能不能改变(.java内容不能变),但是要给他的唱歌跳舞功能增加 + 一些金额判断的功能. + */ + + JingJiRen jingJiRen = new JingJiRen(caiXuKun); + jingJiRen.sing(150); + jingJiRen.dance(180); + jingJiRen.eat(); + } +} diff --git a/javaSE-day13/src/com/inmind/proxy01/Demo03.java b/javaSE-day13/src/com/inmind/proxy01/Demo03.java new file mode 100644 index 0000000..4dea28b --- /dev/null +++ b/javaSE-day13/src/com/inmind/proxy01/Demo03.java @@ -0,0 +1,41 @@ +package com.inmind.proxy01; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +/* + 静态代理:直接定义一个固定的类,增强某个类的功能(JingJiRen) + 动态代理:不用定义一个固定的类,动态地增强某个类的功能 + + 需求:蔡徐坤的类不能改变,也不能定义经纪人类,但是还想对蔡徐坤的唱跳功能,增强金额判断 + 此时只能使用动态代理. + */ +public class Demo03 { + public static void main(String[] args) { + //创建出被代理的类-蔡徐坤 + CaiXuKun caiXuKun = new CaiXuKun(); + + + //动态代理参数一:类加载器 + ClassLoader classLoader = caiXuKun.getClass().getClassLoader(); + //动态代理参数二:代理对象要与被代理对象拥有相同的功能,(实现同一套接口) + Class[] interfaces = caiXuKun.getClass().getInterfaces(); + //动态代理参数三:处理器对象,用来处理代理对象的业务逻辑 + InvocationHandler handler = new InvocationHandler() { + /* + 注意:动态代理对象singerProxy调用任意方法功能,都会引起处理器的invoke方法来执行 + */ + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + System.out.println("处理器的invoke方法执行了"); + return null; + } + }; + + //动态地创建出一个代理对象(类似一个经纪人) + Singer singerProxy = (Singer) Proxy.newProxyInstance(classLoader, interfaces, handler);//多态 + singerProxy.dance(10); + singerProxy.sing(10); + } +} diff --git a/javaSE-day13/src/com/inmind/proxy01/JingJiRen.java b/javaSE-day13/src/com/inmind/proxy01/JingJiRen.java new file mode 100644 index 0000000..fc26ecb --- /dev/null +++ b/javaSE-day13/src/com/inmind/proxy01/JingJiRen.java @@ -0,0 +1,35 @@ +package com.inmind.proxy01; + +public class JingJiRen implements Singer{ + + Singer singer;//表示该经纪人能代理的歌手 + + public JingJiRen(Singer singer) { + this.singer = singer; + } + + @Override + public void sing(int money) { + //金额判断 + if (money > 100) { + this.singer.sing(money); + } else { + System.out.println("钱不够,一边玩去"); + } + } + + @Override + public void dance(int money) { + //金额判断 + if (money > 120) { + this.singer.dance(money); + } else { + System.out.println("钱不够,一边玩去"); + } + } + + @Override + public void eat() { + System.out.println("坤坤没空,你看我怎么样??"); + } +} diff --git a/javaSE-day13/src/com/inmind/proxy01/Singer.java b/javaSE-day13/src/com/inmind/proxy01/Singer.java new file mode 100644 index 0000000..e755b3e --- /dev/null +++ b/javaSE-day13/src/com/inmind/proxy01/Singer.java @@ -0,0 +1,7 @@ +package com.inmind.proxy01; +//定义出一个歌手的规范,只要拥有该接口的方法,那么对应的类就算是一个歌手类 +public interface Singer { + void sing(int money); + void dance(int money); + void eat(); +}