当前位置: 首页 > 编程日记 > 正文

支撑Spring的基础技术:泛型,反射,动态代理,cglib等

1.静态代码块和非静态代码块以及构造函数

出自尚学堂视频:《JVM核心机制 类加载全过程 JVM内存分析 反射机制核心原理 常量池理解》

public class Parent {static String name = "hello";//非静态代码块{System.out.println("1");}//静态代码块static {System.out.println("2");}public Parent() {System.out.println("3");}
}

public class Child extends Parent {static String childName = "hello";{System.out.println("4");}static {System.out.println("5");}public Child() {System.out.println("6");}
}

调用测试

public class StaticCodeBlockOrderTest {public static void main(String[] args) {new Child();}
}


对象的初始化顺序:
首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,
如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。
子类的非静态代码块执行完毕再去执行子类的构造方法。

参考:java中静态代码块的用法 static用法详解

静态代码块的应用

需要一个Util类,需要系统初始化的时候就初始化一个hashMap,部分代码省略以...代替

    private static Map<String, List<String>> smap = new HashMap<String, List<String>>();static {for (int i = 0; i < k; i++) {List<String> ls = new ArrayList<String>();ls.add(...);ls.add(...);smap.put(..., ls);}}

这个一样的用法:Map的静态赋值

-------------------

泛型:

这个老外讲的很好《Java Generics》

泛型方法

static 后的<E>是泛型声明,这样才可以在这个方法参数和方法体用泛型

static <E>后的Set<E>是返回值

泛型类:

不用泛型需要强转:

2.泛型 Class<T>和Class<?>的差异

public class Box<T> {private T t;public Box(){}public Box(T data){this.t=data;}public T getT() {return t;}public void setT(T t) {this.t = t;}
}

调用

    public static void main(String[] args) {Box<String> s=new Box<String>("abc");Box<Integer> i=new Box<Integer>(123);System.out.println("s class:" + s.getClass());System.out.println("i class:" + i.getClass());System.out.println(s.getClass() == i.getClass());
}

输出

为什么有Class<T>还需要Class<?>呢?

其实看这个就明白了
在其他类中例如这个Test里,你可以定义

    public static void getData(Box<String> data){System.out.println("data :" + data.getT());}


也可以定义

    public static void getData(Box<Integer> data){System.out.println("data :" + data.getT());}

但是你要是同时定义这2个就会报错

名称冲突: getData(Box<Integer>)和getData(Box<String>)具有相同疑符


使用通配符?就可以解决这个问题

public class TestMain {public static void main(String[] args) {Box<String> s=new Box<String>("abc");Box<Integer> i=new Box<Integer>(123);System.out.println("s class:" + s.getClass());System.out.println("i class:" + i.getClass());System.out.println(s.getClass() == i.getClass());getData(s);getData(i);}public static void getData(Box<?> data){System.out.println("data :" + data.getT());}
}

参考:

Java总结篇系列:Java泛型

java中的泛型总结

再来看看Class<?>的用处

public class TestMain {public static void main(String[] args) {Box<String> s=new Box<String>("http://blog.csdn.net/unix21");Box<Integer> i=new Box<Integer>(123);System.out.println("s class:" + s.getClass());System.out.println("i class:" + i.getClass());System.out.println(s.getClass() == i.getClass());getData(Box.class);}public static void getData(Class<?> clz){try {System.out.println(clz);System.out.println("clz.hashCode():" + clz.hashCode());Object o=clz.newInstance();o.hashCode();System.out.println("o.hashCode():" + o.hashCode());} catch (Exception e) {  System.out.println(e);  }  }
}

((Box)clz).getT();会报错:

不能将 "class java.lang.Class (no class loader)" 的实例强制转换为 "class test.Box (loaded by instance of sun.misc.Launcher$AppClassLoader(id=144))" 的实例

说明还没有class loader

((Box)o).getT();就已经实例化了。

3.Object类型

定义的所有类默认都是子类,所有的类都是以标准类Object为基础,Object类型的变量可以存储指向任意类类型对象的索引。

当要为一个方法来处理未知类型的对象时,这很有用。

//存储的地方HashMap<String , Object> map = new HashMap<String , Object>();User u1=new User();u1.setId(1);u1.setName("ww1");//Object可以塞任意类型map.put("user",u1);User u=(User)map.get("user");response.getWriter().println("Hello Servlet >>>"+u.getName());String clazz ="com.w1.User"; //bean.getAttributeValue("class");try {//反射Object o = Class.forName(clazz).newInstance();map.put("user2",o);User u2=(User)map.get("user2");u2.setName("ww223");response.getWriter().println("Hello Servlet >>>"+u2.getName());} catch (Exception e) {e.printStackTrace();}

4.类名.class, class.forName(), getClass()区别

1:Class cl=A.class;  
JVM将使用类A的类装载器, 将类A装入内存(前提是:类A还没有装入内存),不对类A做类的初始化工作.返回类A的Class的对象。
2:Class cl=对象引用o.getClass();
返回引用o运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象 。
3:Class.forName("类名");
.装入类A,并做类的初始化
.getClass()是动态的,其余是静态的。
.class和class.forName()只能返回类内field的默认值,getClass可以返回当前对象中field的最新值
Class.forName() 返回的是一个类,.newInstance() 后才创建一个对象,Class.forName()的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的。

public class Person {private String name = "Alfira";public void getName() {System.out.println(name);}public void setName(String name, int a) {this.name = name + a;}
}

    private static void show(String name) {try {// JVM将使用类A的类装载器,将类A装入内存(前提是:类A还没有装入内存),不对类A做类的初始化工作Class classtype3 = Person.class;// 获得classtype中的方法Method getMethod3 = classtype3.getMethod("getName", new Class[] {});Class[] parameterTypes3 = { String.class, int.class };Method setMethod3 = classtype3.getMethod("setName", parameterTypes3);// 实例化对象,因为这一句才会输出“静态初始化”以及“初始化”Object obj3 = classtype3.newInstance();// 通过实例化后的对象调用方法getMethod3.invoke(obj3); // 获取默认值setMethod3.invoke(obj3, "Setting new ", 3); // 设置getMethod3.invoke(obj3); // 获取最新System.out.println("----------------");// 返回运行时真正所指的对象Person p = new Person();Class classtype = p.getClass();// Class.forName(name);// 获得classtype中的方法Method getMethod = classtype.getMethod("getName", new Class[] {});Class[] parameterTypes = { String.class, int.class };Method setMethod = classtype.getMethod("setName", parameterTypes);getMethod.invoke(p);// 获取默认值setMethod.invoke(p, "Setting new ", 1); // 设置getMethod.invoke(p);// 获取最新System.out.println("----------------");// 装入类,并做类的初始化Class classtype2 = Class.forName(name);// 获得classtype中的方法Method getMethod2 = classtype2.getMethod("getName", new Class[] {});Class[] parameterTypes2 = { String.class, int.class };Method setMethod2 = classtype2.getMethod("setName", parameterTypes2);// 实例化对象Object obj2 = classtype2.newInstance();// 通过实例化后的对象调用方法getMethod2.invoke(obj2); // 获取默认值setMethod2.invoke(obj2, "Setting new ", 2); // 设置getMethod2.invoke(obj2); // 获取最新System.out.println("----------------");} catch (Exception e) {System.out.println(e);}}


调用

show("com.Person");


参考此文:http://www.cnblogs.com/feiyun126/archive/2013/08/01/3229492.html

http://blog.163.com/granite8@126/blog/static/853746082008610102657141/

5.动态代理和cglib

public class SayHello {public void say(){System.out.println("hello everyone");}
}

import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;public class CglibProxy implements MethodInterceptor {private Enhancer enhancer = new Enhancer();public Object getProxy(Class clazz) {//设置需要创建子类的类enhancer.setSuperclass(clazz);enhancer.setCallback(this);//通过字节码技术动态创建子类实例return enhancer.create();}//实现MethodInterceptor接口方法public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("前置代理");//通过代理类调用父类中的方法Object result = proxy.invokeSuper(obj, args);System.out.println("后置代理");return result;}
}

调用

 CglibProxy proxy = new CglibProxy();//通过生成子类的方式创建代理类SayHello proxyImp = (SayHello)proxy.getProxy(SayHello.class);proxyImp.say();

CGLib动态代理原理及实现

Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)[转]

cglib动态代理介绍(一)

6.模仿Spring实现

需要说这个作者写到这一系列文章非常好【SSH进阶之路】一步步重构容器实现Spring框架——彻底封装,实现简单灵活的Spring框架(十一)

代码:http://download.csdn.net/detail/jiuqiyuliang/8483981

这篇博文的目标是不仅形似Spring的IoC,而且要神似Spring的IoC,将对象的依赖关系进一步封装。

完整的项目结构

Dao接口和实现

public interface Dao {public void daoMethod();
}
public class Dao4MySqlImpl implements Dao {public void daoMethod(){System.out.println("Dao4MySqlImpl.daoMethod()");}
}
public class Dao4OracleImpl implements Dao {public void daoMethod(){System.out.println("Dao4OracleImpl.daoMethod()");}
}


Service接口和实现

public interface Service {public void serviceMethod();
}
public class ServiceImpl implements Service {private Dao dao;  //依赖注入public void setDao(Dao dao) {this.dao= dao;}@Overridepublic void serviceMethod() {dao.daoMethod();}
}

public interface BeanFactory {Object getBean(String beanName);
}
import java.util.ArrayList;
import java.util.List;public class BeanDefinition {private String id;private String className;private List<PropertyDefinition> propertys = new ArrayList<PropertyDefinition>();public BeanDefinition(String id, String className) {this.id = id;this.className = className;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getClassName() {return className;}public void setClassName(String className) {this.className = className;}public List<PropertyDefinition> getPropertys() {return propertys;}public void setPropertys(List<PropertyDefinition> propertys) {this.propertys = propertys;}
}

核心容器

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 容器** @author liang**/
public class ClassPathXmlApplicationContext implements BeanFactory {// 用于存放Beanprivate List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();// 用于存放Bean的实例private Map<String, Object> sigletons =new HashMap<String, Object>();public ClassPathXmlApplicationContext(String fileName) {this.readXML(fileName);this.instanceBeans();this.injectObject();}/*** 为bean对象的属性注入值*/private void injectObject() {for (BeanDefinition beanDefinition :beanDefines) {Object bean = sigletons.get(beanDefinition.getId());if(bean != null){try {// 通过Introspector取得bean的定义信息,之后再取得属性的描述信息,返回一个数组PropertyDescriptor[] ps = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();for(PropertyDefinition propertyDefinition:beanDefinition.getPropertys()){for(PropertyDescriptor properdesc: ps){if(propertyDefinition.getName().equals(properdesc.getName())){// 获取属性的setter方法,privateMethod setter = properdesc.getWriteMethod();if(setter != null){Object value = sigletons.get(propertyDefinition.getRef());// 允许访问私有方法setter.setAccessible(true);// 把引用对象注入到属性setter.invoke(bean, value);}break;}}}} catch (Exception e) {e.printStackTrace();}}}}/*** 完成bean的实例化*/private void instanceBeans() {for(BeanDefinition beanDefinition : beanDefines){try {if(beanDefinition.getClassName() != null && !"".equals(beanDefinition.getClassName().trim())){sigletons.put(beanDefinition.getId(),Class.forName(beanDefinition.getClassName()).newInstance() );}} catch (Exception e) {e.printStackTrace();}}}/*** 读取xml配置文件*/private void readXML(String fileName) {// 创建SAXBuilder对象SAXBuilder saxBuilder = new SAXBuilder();try {// 读取资源,获得document对象Document doc = saxBuilder.build(this.getClass().getClassLoader().getResourceAsStream(fileName));// 获取根元素Element rootEle = doc.getRootElement();// 从根元素获得所有的子元素,建立元素集合List listBean = XPath.selectNodes(rootEle, "/beans/bean");// 遍历根元素的子元素集合,扫描配置文件中的beanfor (int i = 0; i < listBean.size(); i++) {// 将根元素beans下的bean子元素作为一个新的子根元素Element elementBean = (Element) listBean.get(i);//获取id属性值String id = elementBean.getAttributeValue("id");//获取class属性值String clazz = elementBean.getAttributeValue("class");BeanDefinition beanDefine = new BeanDefinition(id,clazz);// 获取子根元素bean下的所有property子元素List listProperty = elementBean.getChildren("property");// 遍历子根元素的子元素集合(即遍历property元素)for (int j = 0; j < listProperty.size(); j++) {// 获取property元素Element elmentProperty = (Element)listProperty.get(j);// 获取name属性值String propertyName = elmentProperty.getAttributeValue("name");// 获取ref属性值String propertyref = elmentProperty.getAttributeValue("ref");PropertyDefinition propertyDefinition = new PropertyDefinition(propertyName,propertyref);beanDefine.getPropertys().add(propertyDefinition);}// 将javabean添加到集合中beanDefines.add(beanDefine);}} catch (Exception e) {e.printStackTrace();}}/*** 获取bean实例*/@Overridepublic Object getBean(String beanName) {return this.sigletons.get(beanName);}
}

public class PropertyDefinition {private String name;private String ref;public PropertyDefinition(String name, String ref) {this.name = name;this.ref = ref;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getRef() {return ref;}public void setRef(String ref) {this.ref = ref;}}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans><bean id="dao" class="com.tgb.container.dao.impl.Dao4MySqlImpl" /><bean id="service" class="com.tgb.container.service.impl.ServiceImpl"><property name="dao" ref="dao"></property></bean>
</beans>


7.Smart Framework

Smart Framework:轻量级 Java Web 框架

Smart Framework是一个完整的类似Spring但是更轻量级的项目,学习框架的最佳材料之一。

相关文章:

深度干货!如何将深度学习训练性能提升数倍?

作者 | 车漾&#xff0c;阿里云高级技术专家顾荣&#xff0c;南京大学副研究员责编 | 唐小引头图 | CSDN 下载自东方 IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;近些年&#xff0c;以深度学习为代表的人工智能技术取得了飞速的发展&#xff0c;正落地应用于…

VIM变IDE

2019独角兽企业重金招聘Python工程师标准>>> 根据这篇博文写了个脚本&#xff0c;简单的解压插件和复制配置&#xff0c;可以帮大家快速配置一个VIM。 脚本中使用rpm安装ctags&#xff0c;所以只支持redhat系的&#xff0c;debian系的要自己安装ctags. 脚本放在gith…

Netbeans使用maven下载源码

如果需要研究源码&#xff0c;自然需要下载源码&#xff0c;其实Netbeans使用maven构建项目下载源码非常简单。 springmvc一开始没有下载源码 commons-lang3是下了源码的&#xff0c;下面是对其调用的代码 可以看到点开其代码是源码&#xff0c;也可以打断点 开一个调试 下载源…

讯飞智能语音先锋者:等到人机交互与人类交流一样自然时,真正的智能时代就来了...

作者 | 夕颜出品 | CSDN&#xff08;ID:CSDNnews&#xff09;「AI 技术生态论」 人物访谈栏目是 CSDN 发起的百万人学 AI 倡议下的重要组成部分。通过对 AI 生态顶级大咖、创业者、行业 KOL 的访谈&#xff0c;反映其对于行业的思考、未来趋势的判断、技术的实践&#xff0c;以…

今天看到两个题 写出来思考一下

数组中已有升序的6个数,输入一个数插入到数组中该数组仍然升序. 1&#xff0c;6&#xff0c;9&#xff0c;23&#xff0c;56&#xff0c;95 输入一个数 50 输出 1&#xff0c;6&#xff0c;9&#xff0c;23&#xff0c;56&#xff0c;50&#xff0c;95 题目二 输入一个…

android开发之动画的详解 整理资料 Android开发程序小冰整理

2019独角兽企业重金招聘Python工程师标准>>> /** * 作者&#xff1a;David Zheng on 2015/11/7 15:38 * * 网站&#xff1a;http://www.93sec.cc * * 微博&#xff1a;http://weibo.com/mcxiaobing * * 微博&#xff1a;http://weibo.com/93sec.cc */ 个人交流QQ9…

框架源码学习笔记

1.WebListener Servlet3.0提供WebListener注解将一个实现了特定监听器接口的类定义为监听器&#xff0c;这样我们在web应用中使用监听器时&#xff0c;也不再需要在web.xml文件中配置监听器的相关描述信息了。 Web应用启动时就会初始化这个监听器 WebListener public class M…

20万个法人、百万条银行账户信息,正在暗网兜售

导语&#xff1a;推特用户爆料&#xff0c;暗网上正在出售大量中国数个银行的账号信息&#xff0c;经记者调查&#xff0c;本次打包售价 3999 美金中包含 90 万条中国农业银行账号信息&#xff0c;另外一账号还宣称出售二十个数据包&#xff0c;其中包括百万条银行账号数据、12…

2010年9月blog汇总:敏捷个人和模型驱动开发

9月份指标产品开发开始同时进行两个客户的开发&#xff0c;所以考虑了客户化如何开发的问题&#xff1b;在企业定额产品上&#xff0c;参与清单综合单价库的产品架构并做了用户调研前期准备工作&#xff1b;再就是整理了一下模型驱动开发理论以及思考了OpenExpressApp的几个建模…

Tomcat的配置及优化

Tomcat 服务器是基于Apache 软件基金会项目开发的一个免费的开放源代码的Web 应用服务器它是开发和调试JSP 程序的首选&#xff0c;主要用在中小型系统和并发访问用户不是很多的场合&#xff0c;实际Tomcat 部分是Apache 服务器的扩展&#xff0c;但它是独立运行的&#xff0c;…

JAX-WS Web 服务开发调用和数据传输分析

一. 开发服务 新建maven的web项目就可以了&#xff0c; 1.新建一个web服务 2.服务名称定义 3.更改配置 4.默认建好的服务文件 5.增加一个add的服务 import javax.jws.WebService; import javax.jws.WebMethod; import javax.jws.WebParam;/**** author Administrator*/ WebSer…

如何在高精度下求解亿级变量背包问题?

导读&#xff1a;国际顶级会议WWW2020将于4月20日至24日举行。始于1994年的WWW会议&#xff0c;主要讨论有关Web的发展&#xff0c;其相关技术的标准化以及这些技术对社会和文化的影响&#xff0c;每年有大批的学者、研究人员、技术专家、政策制定者等参与。以下是蚂蚁金服的技…

收集到的一些网络工程师面试题 和大家分享下

1: 交换机是如何转发数据包的?交换机通过学习数据帧中的源MAC地址生成交换机的MAC地址表&#xff0c;交换机查看数据帧的目标MAC地址&#xff0c;根据MAC地址表转发数据&#xff0c;如果交换机在表中没有找到匹配项&#xff0c;则向除接受到这个数据帧的端口以外的所有端口广播…

incompatible with sql_mode=only_full_group_by

使用mysql 5.7.11-debug Homebrew时报错 错误信息如下&#xff1a; 26 Mar 2016 09:35:23,432 ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper:147 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘tv2.t_pic_news…

Java动态加载一个类的几种方法以及invoke

一.加载一个类的几种方法 接口 IUser package org.me.javaapp;/**** author Administrator*/ public interface IUser {}User.java /** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templ…

今晚20:00 | 港科大郑光廷院士详解人工视觉技术发展及应用

阳春三月&#xff0c;万象更新&#xff0c;2020年注定是不平凡的一年&#xff01;有激荡就会遇见变革&#xff0c;有挑战就会迎来机遇。今天总会过去&#xff0c;未来将会怎样&#xff1f;香港科大商学院内地办事处重磅推出全新升级的《袁老师访谈录》全新系列【问诊未来院长系…

Openoffice 安装与配置

1、软件下载 路径&#xff1a;http://download.openoffice.org/ 2、软件安装 [rootOpenbo linux]# tar zxvf OOo_3.2.1_Linux_x86_install-rpm-wJRE_zh-CN.tar.gz[rootOpenbo linux]# cd OOO320_m18_native_packed-1_zh-CN.9502/[rootOpenbo OOO320_m18_native_packed-1_zh-CN.…

比较分析与数组相关的sizeof和strlen

// 形如&#xff1a; int a[]{1,2,3,4,5}; char name[]"abcdef";无论是整型数组还是字符数组&#xff0c;数组名作为右值的时候都代表数组首元素的首地址。数组发生降级&#xff08;数组名退化为数组首元素的地址&#xff09;的情况&#xff1a;数组传参、数组名参与…

Python正则表达式,看这一篇就够了

作者 | 猪哥来源 | 裸睡的猪&#xff08;ID: IT--Pig&#xff09;大多数编程语言的正则表达式设计都师从Perl&#xff0c;所以语法基本相似&#xff0c;不同的是每种语言都有自己的函数去支持正则&#xff0c;今天我们就来学习 Python中关于 正则表达式的函数。re模块主要定义了…

Spring MVC 4

Spring MVC 4 项目文件结构 pom.xml依赖 <properties><endorsed.dir>${project.build.directory}/endorsed</endorsed.dir><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies> …

SQL Server 2008高可用性系列:数据库快照

SQL Server 2008高可用性系列&#xff1a;数据库快照http://database.51cto.com 2010-09-13 14:45 我爱菊花 博客园 我要评论(0)摘要&#xff1a;我们今天要讨论的话题是数据库快照。在SQL Server 2008高可用性中&#xff0c;快照是一项很重要的内容&#xff0c;可以提供至…

PostgreSQL 9.3 beta2 stream replication primary standby switchover bug?

[更新]已有patch. 请参见.PostgreSQL 9.1,9.2,9.3 clean switchover Primary and Standby Patch. http://blog.163.com/digoal126/blog/static/16387704020136197354054/打补丁前的测试 : PostgreSQL 9.3 beta2 无法完成正常的主备角色切换.Primary : psql checkpont; pg_cont…

Apache commons-io

添加引用 <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency>按行写&#xff1a; public static void writeFileLineByApacheIO(String fileContent) throws…

Oracle Exadata 简介

随着企业业务的发展&#xff0c;大型数据仓库越来越多&#xff0c;其规模也在迅速扩大&#xff0c;平均每两年规模增大3倍。大型数据仓库要求以最高的磁盘读取速度扫描几十、几百或几千个磁盘&#xff0c;只有磁盘和服务器之间的管道带宽增加10倍或更多才能满足此要求&#xff…

推荐系统的价值观

作者丨gongyouliu来源丨大数据与人工智能&#xff08;ID: ai-big-data&#xff09;推荐系统作为满足人类不确定性需求的一种有效工具&#xff0c;是具有极大价值的&#xff0c;这种价值既体现在提升用户体验上&#xff0c;又体现在获取商业利润上。对绝大多数公司来说&#xff…

PostgreSQL md5 auth method introduce, with random salt protect

在上一篇BLOG中介绍了不要在pg_hba.conf中使用password认证方法, 除非你的客户端和数据库服务器之间的网络是绝对安全的.http://blog.163.com/digoal126/blog/static/1638770402013423102431541/MD5方法,认证过程 : Encrypting Passwords Across A Network The MD5 authenticat…

常用Maven收集以及Maven技巧

1.完整的Maven的pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apach…

大促下的智能运维挑战:阿里如何抗住“双11猫晚”?

作者 | 阿里文娱技术专家子霖出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;2019 双 11 猫晚在全球近 190 个国家和地区播出&#xff0c;海外重保是首要任务&#xff0c;如何提升海外用户观看猫晚的体验&#xff1f;本文将详解双 11 猫晚国际化的技术挑战和技术策略…

这次真的是下定决心了

这次我想是真的&#xff0c;真的。 上上周买了一本书 数据结构 c版 看到这本书的重点 线性表第三节&#xff0c;看不下去了&#xff0c;由于我模板学的不怎么样&#xff0c;数据结构c版大部分涉及了c 的模板&#xff0c;而且我觉得这本书上的代码有些漏洞。上上周买书的第三天…

子弹实例化的代码

using UnityEngine; using System.Collections;public class fire : MonoBehaviour {public float rate 0.2f;public GameObject bullet;private void Start(){OnFire();}//实例化子弹public void Fire(){GameObject.Instantiate(bullet, transform.position, Quaternion.iden…