Java代理的小知识

这篇博客主要是看了一位大牛的博客所写的,该大牛写的是数据库连接池的实现,看了他的代码,顿时觉得很牛牛。所以在这里我也记录下我自己的demo,虽然不提倡重复造轮子,但是很多时候我们在重复造轮子的过程中才会有技术的提高,所以在这里我就重复造下轮子吧

这篇博客主要写的是关于Java动态代理的一个demo

情景如下:

在LOL游戏中,有个现象是代练的问题,实际游戏账号者会请代练,而这个代练在这里就是代理,帮实际游戏账号者进行帮打晋级赛的活动

UML图我就不画了,目前对这方面的知识还没去学,打算过段时间再去学

首先是一个接口:

public interface GameService {

	abstract public void login();

	abstract public void rank();

	abstract public void normal();
}

实际游戏者类:

 1 public class LoLGame implements GameService {
 2
 3     @Override
 4     public void login() {
 5         System.out.println(" 登录 LOL 客户端啦 ");
 6     }
 7
 8     @Override
 9     public void rank() {
10         System.out.println("在LOL游戏中打排位赛啦");
11     }
12
13     @Override
14     public void normal() {
15         System.out.println("在LOL游戏中打匹配塞啦");
16     }
17 }

现在就要请代练了,让代练帮我们打排位赛了, 在这里的业务逻辑是如果是排位的话就让代练打,普通匹配塞就自己打

public static void main(String[] args) {

		LoLGame lol = new LoLGame();//实际游戏者

		//生成代练者,排位赛让代练打,匹配赛自己打
		GameService service = (GameService)Proxy.newProxyInstance(LoLGame.class.getClassLoader()
				, LoLGame.class.getInterfaces()
				, new InvocationHandler() {

					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						if(method.getName().equals("login")) {//判断方法名,进行相应的业务操作
							System.out.println(" 让代练登录,这样下面的排位赛他才可以打! 代练也是调用实际游戏者的账号登录");
							method.invoke(lol, args);
						} else if (method.getName().equals("rank")) {
							System.out.println(" 现在是排位赛,让代练去打吧,就不调用实际游戏的排位赛方法了,这样就可以上最强王者啦");
						} else if(method.getName().equals("normal")) {
							System.out.println(" 现在是匹配赛,带妹纸装逼去咯。");
							method.invoke(lol, args);
						}
						return null;
					}
				});
		service.login();
		service.rank();
		service.normal();
	}

  

运行效果:

让代练登录,这样下面的排位赛他才可以打! 代练也是调用实际游戏者的账号登录
登录 LOL 客户端啦
现在是排位赛,让代练去打吧,就不调用实际游戏的排位赛方法了,这样就可以上最强王者啦
现在是匹配赛,带妹纸装逼去咯。
在LOL游戏中打匹配塞啦

代码很粗糙,也对大牛他提到的 Collection保证将自己返回到LinkedList中是此处编程的难点  这点也有些了解了

时间: 2024-08-27 10:20:34

Java代理的小知识的相关文章

Java代理的小例子

利用代理可以在运行时创建一个实现了一组给定接口的新类. 需要一个调用处理器(invocation handler),调用处理器需实现InvocationHandler接口.无论何时调用代理对象的方法,调用处理器的invoke方法都会被调用,并向其传递Method对象和原始的调用参数. 创建代理对象,需要使用Proxy类的newProxyInstance方法.此方法有三个参数: 1.一个类加载器(class loader),null代表默认 2.接口数组 3.一个调用处理器 使用代理的作用: 1.

01 java开发前小知识

1.常见的dos命令 盘符: 进入指定的盘符下. dir : 列出当前目录下的文件以及文件夹 md : 创建目录 rd : 删除目录    注意:rd不能删除非空的文件夹,而且只能用于删除文件夹. cd : 进入指定目录 cd.. : 退回到上一级目录 cd \ : 退回到根目录 echo "hello java">a.txt  写入文本到指定文件  type a.txt 显示文件内容命令 del : 删除文件    注意:不能删除文件夹,只能删除文件. exit : 推出dos

Java Web实用小知识02

日期时间转换到页面显示 两种方式: 1. OutputStream out = response.getOutputStream(); map.put("enterFromTime", sdf.format(itemData.getEnterFromTime()));// 入单时间 2. map.put("changeTime", DateUtil.formatDate(itemData.getChangeTime()));// 转单时间 第2种好. 日期加一天 高

Java 字符串比较小知识

使用 String.compareTo 方法: compareTo() 的返回值是int, 它是先比较对应字符的大小(ASCII码顺序). 1.如果字符串相等,返回值0. 2.如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值(ascii码值)(负值,前字符串的值小于后字符串:正值,前字符串大于后字符串). 3.如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方全比较完,这时就比较字符的长度. String

java中一些小知识和面试问题

抽象类的总结几点: · 抽象类与普通类相比最大的不同只是在于抽象类之中存在有抽象方法,所以在抽象类之中依   然可以定义属性.构造方法等 · 抽象类声明时不允许使用 final,抽象类必须要求有子类,而 final 定义的类是不能够有子类的. · 抽象类之中即使没有抽象方法,那么也不能够被直接实例 JAVA 中的主方法可以说创造了一个长的之最,其组成有许多的关键字,下面来分析每一个关键字:  · public:指的是公共的:  · static:使用 static 定义的方法必须由类名称调用: 

java类型的小知识List 等

List 复制之 浅拷贝与深拷贝 详细连接https://blog.csdn.net/never_tears/article/details/79067245 java中判断字符串是否为数字的方法的几种方法 https://blog.csdn.net/u013066244/article/details/53197756 java 基本类型详解 及 常见问题 https://blog.csdn.net/sunshoupo211/article/details/23001137 详细连接https

java基础数据类型小知识

数据类型的扩展 银行业务的处理 说到数字,我们可能第一想到的是int .浮点型数据类型 但是对于"钱"来说,用浮点型数据类型是不行的,Int更是不可以 为何浮点型不可以? 因为浮点型float double是有限的,离散的,舍入误差的,大约,接近但是不相等 我们在处理这些需要精度的数据的时候应该要避免使用浮点数 float f=0.1f; //0.1 double d=1.0/10; //0.1 System.out.println(f==d); //false float d1=22

Java Web实用小知识01

${ctx}与 ${pageContext.request.contextPath}这两个为一个意思,都是获取当前根目录. 不同的是${ctx}为${pageContext.request.contextPath}的简写版,经查证之后果真如此, 发现在项目的一个文件内有这样一段话的配置<c:setvar="ctx"value="${pageContext.request.contextPath}"/> 注意在使用${ctx的时候一定不要忘记把带有该配置的

Java中常量小知识

常量分类:常量分为静态常量,非静态常量(全局常量),局部常量 静态常量:要么定义的时候赋初值,要么在静态代码块中赋值 非静态常量:要么在定义的时候赋初值,要么在代码块中赋值 局部常量:可以在定义时赋初值,也可以在使用前赋值 注意:接口中只存在一种常量,就是静态常量,必须定义时赋值,因为在接口中不存在代码块. 为什么局部变量不初始化? 局部变量,都是存在栈中的.而栈是快速重复的大量使用,如果每次使用都初始化,开销会比较大,不如,直接让程序员来手动初始化.