JavaScript设计经典模式和反射机制

​  主要学习JavaScript中的六大原则,那么六大原则还记得是什么了吗,六大原则指:单一职责原则(SRP),开放封闭原则(OCP),里氏替换原则(LSP),依赖倒置原则(DIP),接口分离原则(ISP),最少知识原则(LKP)。

单一职责原则。

开放封闭原则。

里氏替换原则。

依赖倒置原则。

接口分离原则。

最少知识原则。

那么什么是单一职责原则呢,单一职责原则,英文单词为:singleresponsableprincple,原则体现为,一个对象或者是方法只做一件事。

从前车马很慢,书信很远,一生只够爱一个人,“从前的日色变得慢,车,马,邮件都慢,一生只够爱一个人从前的锁也好看,钥匙精美有样子,你锁了,人家就懂了”(一个对象或者是方法只做一件事情)。

如果一个方法承担了很多很多的职责,那么它在需长春Java培训求发生变化的过程中,需要改写这个方法的可能性就很大。

单一职责原则,一个类只提供一种功能,不要存在过多导致类变化的原因,从前,一个人负责两个不同的任务,为任务1,任务2,当任务1需要做调整时,而需要这个人做修整时,有可能会影响任务2的正常运行,会导致任务2没有办法完成。

遵循单一职责原则,就可以解决这种情况的发生,分别让两个人分别做任务1,任务2,让人1做任务1,让人2做任务2,这样,当需要改变任务1时,不会影响到任务2的正常运行,同理,任务2需要做修改时,人1做的事也不会发生影响。

里氏替换原则:所有引用基类的地方必须能够使用其子类的对象,从前有一个游戏玩家A,它有一个招式Z1,现在把这个招式Z1进行扩展,扩展后成为大招Z,其大招Z由原来的招式Z1和新功能Z2组成,新功能Z又由游戏玩家A的子长春Java培训哪家好类徒弟游戏玩家B去完成,那么这个子类徒弟游戏玩家B在完成这个新功能Z2的同时,有可能会影响到原来的招式Z1,而导致招式发生错误。

(迪米特法则:只与直接的朋友通信),每个对象都会和其他对象有耦合的关系,只要两个对象之间有耦合关系,就说这两个对象之间是朋友关系。

类初始化概述。

类的初始化指的是将我们编写的类文件编译之后生成的字节码文件进行加载,连接,初始化的过程,其中字节码文件的加载由类加载器完成,通过不同的类加载器,可以对不同来源的字节码文件进行加载,例如:本地文件系统,网路,动态编译动态加载等,当一个类被加载成功之后会生成一个Class对象,接着将会进入类的连接阶段,连接阶段主要完成了类内部结构的验证,类成员内存的分配及初始值设置和将符号引用替换成直接引用,长春Java培训机构经过类的连接阶段后就可以初始化类了,类的初始化主要是对类的普通成员变量和类的静态成员变量进行初始化,那么什么情况下类才会被初始化呢。

1,对象的创建,无论使用new关键字还是反射创建对象,都必须保证对应的类被初始化。

2,静态方法调用,当调用一个静态方法时,类名称作为主调,所以必须保证该类被初始化。

3,反射创建类或接口的Class对象时,必须保证类或接口被初始化。

4,当初始化一个类的子类时,必须保证父类及所有引用的类被初始化。

5,运行一个类的主方法时,必须保证主方法所在的类被初始化。

需要注意的是,对于一个被final关键字修饰的变量被使用时,如果此变量的值在编译时就已经确定了,则在编译的过程中所有使用此变量的地方,都将被变量所对应的值替换,所以使用final关键字修饰的有确定值的变量时,变量所在的类不会被初始化。

Java学习总结“注解”及Maven系列

注解概念。

Java注解是附加在代码中的一些元信息,用于一些工具在编译,运行时进行解析和使用,起到说明,配置的功能。

注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用,包含在java.lang.annotation包中。

其中涉及到另外一个概念“元注解”,元注解是指注解的注解,包括以下五种:。

@Retention。

@Target。

@Document。

@Inherited。

@Repeatable。

注解解释。

@Retention。

当@Retention应用到一个注解上的时候,它解释说明了这个注解的的存活时间。

RetentionPolicy.SOURCE。

注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视,RetentionPolicy.CLASS。

注解只被保留到编译进行的时候,它并不会被加载到JVM中,RetentionPolicy.RUNTIME。

长春Java培训注解可以保留到程序运行的时候,它会被加载进入到JVM中,所以在程序运行时可以获取到它们,@DOCUMENTED。

它的作用是能够将注解中的元素包含到Javadoc中去。

@Target。

@Target指定了注解运用的地方。

ElementType.ANNOTATION_TYPE。

可以给一个注解进行注解。

ElementType.CONSTRUCTOR。

可以给构造方法进行注解。

ElementType.FIELD。

可以给属性进行注解。

ElementType.LOCAL_VARIABLE。

可以给局部变量进行注解。

ElementType.METHOD。

可以给方法进行注解。

ElementType.PACKAGE。

可以给一个包进行注解。

ElementType.PARAMETER。

可以给一个方法内的参数进行注解。

ElementType.TYPE。

可以给一个类型进行注解,比如类,接口,枚举。

@INHERITE长春Java培训哪家好D。

如果一个超类被@Inherited注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解,@REPEATABLE。

@Repeatable是Java1.8才加进来的,所以算是一个新的特性,其实只是语法糖而已。

自定义注解。

注解通过@interface关键字进行定义。

public@interfacePersonAnnotation{。

}。

注解的属性。

注解的属性也叫做成员变量,注解只有成员变量,没有方法,注解的成员变量在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。

整个电商我们可以作为一个大的系统,上面的pc端,h5微站,api接口,后台系统,bi系统,监控系统都可以作为里面的一个具体比较大一个模块。

我们使用maven聚合功能来实现上面的需求,我们需要创建一个额外的maven项目ja长春Java培训机构vacode-aggregator来管理上面3个项目,然后只用在javacode-aggregator项目中执行mvn命令,就会自动为其他3个项目自动执行同样的mvn命令。

Maven聚合。

maven聚合需要创建一个新的maven项目,用来管理其他的maven构件模块,新的maven项目中加入如下配置:。

模块1。

模块2。

模块n。

pom。

新的项目中执行任何mvn命令,都会modules中包含的所有模块执行同样的命令,而被包含的模块不需要做任何特殊的配置,正常的maven项目就行。

注意上面的module元素,这部分是被聚合的模块pom.xml所在目录的相对路径。

package的值必须为pom,这个需要注意。

大型Maven项目和反射概述

maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能。

整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部有maven完整系列的连接。

本篇涉及到的内容属于神技能,多数使用maven的人都经常想要的一种功能,但是大多数人都不知道如何使用,废话不多说,上干货。

需求背景。

我们需要做一个电商项目,一般都会做成微服务的形式,按业务进行划分,本次我们主要以账户业务和订单业务为例,我们将这两块业务分别作为2个大的模块来开发,而订单模块又会调用账户模块中的接口,所以对账户模块接口部分会有依赖。

我们以maven来搭建项目,项目的目录结构如下:长春Java培训。

b2b。

b2b-account。

b2b-account-api。

b2b-account-service。

b2b-order。

b2b-order-api。

b2b-order-service。

b2b-account。

账户模块,其中包含2个小模块:b2b-account-api和b2b-account-service。

b2b-account-api。

账户模块对外暴露的接口部分,以供外部调用。

b2b-account-service。

账户模块具体业务实现,依赖于b2b-account-api模块。

b2b-order。

订单模块,长春Java培训哪家好也是包含2个小模块:b2b-order-api和b2b-order-service。

b2b-order-api。

订单模块对外暴露的接口部分,以供外部调用。

b2b-order-service。

订单模块具体业务实现,依赖2个模块b2b-order-api,b2b-account-api。

搭建项目结构。

我们按照上面的需求,使用maven搭建项目结构。

所谓反射机制,就是指在Java程序运行期间,对于任意一个类,都可以通过该机制获取类的相关信息,例如类拥有的成员变量,方法,内部类,继承的父类,实现的接口,使用的注解信息等等,从面向对象的角度来看,反射机制是对一个java类的高度抽象。

反射常用方法。

  反射类对象提供的方法很有规律,大致分为两大类:获取的目长春Java培训机构标被public访问权限修饰以及所有访问权限修饰,所有访问权限修饰的获取方法都以getDeclare开头,同时这些方法都是成对出现的,目的是获取单个信息和全部信息,需要注意的是获取注解信息时,多出了一对儿以Type结尾的方法,这是在JDK1.8,之后新增的,因为JDK1.8之后支持重复注解的使用,依据此方法,可以获取指定类型的一个或者多个注解信息,还有就是对于接口和父类的获取分别只有一个方法,对于接口获取的是多个,对于父类获取的是一个,因为单继承局限,以上描述的是其反射对象获取类信息的方法,除了这些方法之外还有一些其他的方法,例如:获取包名称,类检查,类名称以及判断是否为注解,匿名内部类,数组,接口等等.。

JavaScript实现代码及题库大全

栈。

第一个数据结构是栈,它与队列非常相似,你之前可能听说过调用栈,这是JavaScript用于处理事件的方法。

最后一个存入栈里的项目将是第一个被移除的项目,这被称为后进先出(LIFO),Web浏览器中的后退按钮就是一个很好的例子:将你查看的每个页面添加到栈中,当你单击“返回”时,将从栈中弹出当前页面(最后添加的页面)。

队列。

接下来讨论队列——希望栈在你的脑子仍然记得很清楚,因为它和队列非常相似,栈和队列之间的主要区别在于队列是先进先出(FIFO),所以两个主要方法是enqueue与dequeue,数据被添加到队尾,并从队首移除,为了更好的理解它,下面开始实现队列。

链表。

先让我们讨论一下强大的链表,这比上面的结构要复杂得多。

可能你第一个问题是为什么要使用链表,链表主要用于没有动态大小调整数组的语言,链表按顺序组织项目,一个项目指向下一个项目。

链表中的每个节点都有一个data值和一个next值,下图中5是data值,next值指长春Java培训向下一个节点,即值为10的节点。

哈希表。

接下来是强大的哈希表。

哈希表是一种实现关联数组的数据结构,这意味着它把键映射到值,JavaScript对象就是一个“哈希表”,因为它存储键值对。

二叉搜索树。

最后一个数据结构是臭名昭著的二叉搜索树。

在二叉搜索树中,每个节点具有零个,一个或两个子节点,左边的称为左子节点,右边的称为右子节点,在二叉搜索树中,左侧的子项必须小于右侧的子项。

Integer与int的区别。

int是java提供的8种原始数据类型之一,Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。

int是java提供的8种原始数据类型之一,Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。

在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,长春Java培训哪家好还需要在hbm映射文件中设置其unsaved-value属性为0。

另外,Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。

java.sql.Date和java.util.Date的联系和区别。

1)java.sql.Date是java.util.Date的子类,是一个包装了毫秒值的瘦包装器,允许JDBC将毫秒值标识为SQLDATE值,毫秒值表示自1970年1月1日00:00:00GMT以来经过的毫秒数,为了与SQLDATE的定义一致,由java.sql.Date实例包装的毫秒值必须通过将时间,分钟,秒和毫秒设置为与该实例相关的特定时区中的零来“规范化”,说白了,java.sql.Date就是与数据库Date相对应的一个类型,而java.util.Date是纯java的Date。

2)JAVA里提供的日期和时间类,长春Java培训机构java.sql.Date和java.sql.Time,只会从数据库里读取某部分值,这有时会导致丢失数据,例如一个包含2002/05/225:00:57PM的字段,读取日期时得到的是2002/05/22,而读取时间时得到的是5:00:57PM.你需要了解数据库里存储时间的精度,有些数据库,比如MySQL,精度为毫秒,然而另一些数据库,包括Oracle,存储SQLDATE类型数据时,毫秒部分的数据是不保存的,以下操作中容易出现不易被发现的BUG:获得一个JAVA里的日期对象。

从数据库里读取日期试图比较两个日期对象是否相等,如果毫秒部分丢失,本来认为相等的两个日期对象用Equals方法可能返回false,.sql.Timestamp类比java.util.Date类精确度要高,这个类包了一个getTime()方法,但是它不会返回额外精度部分的数据,因此必须使用…。

  总之,java.util.Date就是Java的日期对象,而java.sql.Date是针对SQL语句使用的,只包含日期而没有时间部分。

Java入门教程及字节码中JVM指令

开始学习Java开发需要搭建java运行环境,这里学长不再详细解释,请自行百度下载安装JDK(Java开发工具包),并配置环境变量,集成IDE(集成开发环境)建议安装IntelliJIDEA,目前最好用的集成开发环境。

首先先从打印一个hellowrold开始学习吧,首先在安装好的IDE界面创建项目:。

弹出的选项框选择Yes:。

此时就可以在IDE中看见默认的模板文件了,在如下图中写上一句:。

点击绿色按钮或者右键点击runmain运行文件即可.此时就可以在下方控制台中看到打印了一行helloworld了。

至此你的第一个java程序就算是从编写到运行结束了,关于如何定义变量以及进行运算,请见下次教程。

Java之所以流行,一个很重要的原因就是它的跨平台特性,CompileOnce,RunAnywhere,编译一次,到处运行,即Java源码只需要编译成字节码文件,之后就可以在不同的操作系统(Windows,Mac,Linux)运行,长春Java培训准确讲是运行在操作系统上的JVM中。

我们都知道通过命令javac来编译Java源代码,但是编译的具体流程步骤你有没有深入了解一下呢,相信很多朋友都没有关注过这一块的内容,今天楠哥就带大家一探究竟,梳理一下Java的编译过程。

1,创建一个Java源文件HelloWorld.java,并在main方法中完成简单的逻辑操作,如下所示。

publicclassHelloWorld{publicstaticvoidmain(String[]args){inti=10,intj=20,intk=i+j,System.out.println(k),}}。

2,在终端通过javac命令编译HelloWorld.java。

javacHelloWorld.java。

3,编译成功之后我们可以看到生成的16进制的字节码文件HelloWorld.class。

cafebabe00000036001b0a0005000e09000f00100a001100120700130700140100063c6长春Java培训哪家好96e69743e010003282956010004436f646501000f4c696e654e756d6265725461626c650100046d61696e010016285b4c6a6176612f6c616e672f537472696e673b295601000a536f7572636546696c6501000f48656c6c6f576f726c642e6a6176610c000600070700150c001600170700180c0019001a01001d636f6d2f736f75746877696e642f746573742f48656c6c6f576f726c640100106a6176612f6c616e672f4f626a6563740100106a6176612f6c616e672f53797374656d0100036f75740100154c6a6176612f696f2f5072696e7453747265616d3b长春Java培训机构0100136a6176612f696f2f5072696e7453747265616d0100077072696e746c6e01000428492956002100040005000000000002000100060007000100080000001d00010001000000052ab70001b1000000010009000000060001000000030009000a000b000100080000003a0002000400000012100a3c10143d1b1c603eb200021db60003b1000000010009000000160005000000060003000700060008000a00090011000a0001000c00000002000d。

  4,16进制的文件我们根本看不出来任何的逻辑结构,所以此时需要对字节码文件进行反汇编,将16进制的内容反编译成我们能看懂的JVM指令,这里我们使用javap-c命令完成。