进阶day13-静态代理实现
This commit is contained in:
18
javaSE-day13/src/com/inmind/proxy01/CaiXuKun.java
Normal file
18
javaSE-day13/src/com/inmind/proxy01/CaiXuKun.java
Normal file
@@ -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("蔡徐坤吃了大盘鸡");
|
||||
}
|
||||
}
|
||||
17
javaSE-day13/src/com/inmind/proxy01/Demo01.java
Normal file
17
javaSE-day13/src/com/inmind/proxy01/Demo01.java
Normal file
@@ -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<Demo01> clazz = Demo01.class;
|
||||
//获取Class的加载器
|
||||
ClassLoader classLoader = clazz.getClassLoader();
|
||||
System.out.println(classLoader);
|
||||
}
|
||||
}
|
||||
30
javaSE-day13/src/com/inmind/proxy01/Demo02.java
Normal file
30
javaSE-day13/src/com/inmind/proxy01/Demo02.java
Normal file
@@ -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();
|
||||
}
|
||||
}
|
||||
41
javaSE-day13/src/com/inmind/proxy01/Demo03.java
Normal file
41
javaSE-day13/src/com/inmind/proxy01/Demo03.java
Normal file
@@ -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);
|
||||
}
|
||||
}
|
||||
35
javaSE-day13/src/com/inmind/proxy01/JingJiRen.java
Normal file
35
javaSE-day13/src/com/inmind/proxy01/JingJiRen.java
Normal file
@@ -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("坤坤没空,你看我怎么样??");
|
||||
}
|
||||
}
|
||||
7
javaSE-day13/src/com/inmind/proxy01/Singer.java
Normal file
7
javaSE-day13/src/com/inmind/proxy01/Singer.java
Normal file
@@ -0,0 +1,7 @@
|
||||
package com.inmind.proxy01;
|
||||
//定义出一个歌手的规范,只要拥有该接口的方法,那么对应的类就算是一个歌手类
|
||||
public interface Singer {
|
||||
void sing(int money);
|
||||
void dance(int money);
|
||||
void eat();
|
||||
}
|
||||
Reference in New Issue
Block a user