手记1

摩森特沃 2022年04月03日 529次浏览

软件破解

Beyond Compare

下载安装后,按照以下步骤进行操作:

  1. 进入Mac应用程序目录下,找到刚刚安装好的Beyond Compare,路径如下/Applications/Beyond Compare.app/Contents/MacOS。
  2. 修改启动程序文件BCompare为BCompare.real。
  3. 在当前目录下新建一个文件BCompare,文件内容如下:
#!/bin/bash
rm "/Users/$(whoami)/Library/Application Support/Beyond Compare/registry.dat"
"`dirname "$0"`"/BCompare.real $@ 
  1. 保存BCompare文件。
  2. 修改文件的权限:
chmod a+x /Applications/Beyond\ Compare.app/Contents/MacOS/BCompare

以上步骤完成后,再次打开Beyond Compare就可以正常使用了

Teamviewer

sudo python ~/Desktop/TeamViewer-id-changer.py

apk反编译

网站资源

H2数据库

开发杂烩

类和实例实例的初始化

类的初始化

类初始化过程
  • 类的初始化就是为类的静态变量赋初始值,或者说是执行类构造器<clinit>方法(非实例构造器方法,由jvm调用,专门处理类初始化的工作)的过程,是一个类或者接口在使用前的最后一项工作,<clinit>方法由静态属性显式赋值语句和静态代码块组成,其执行顺序为从上到下顺序执行且只会执行一次,jvm会保证执行clinit是线程安全的
  • 如果类还没有加载和连接,就先加载和连接
  • 如果类存在父类,且父类没有初始化,就先初始化父类
  • 如果类中存在初始化语句,就依次执行这些初始化语句
  • 如果是接口的话
    • 初始化一个类的时候,并不会初始化它实现的接口
    • 初始化一个接口时,并不会初始化它的父接口
    • 只有当程序首次使用接口里面的变量(接口中的变量也就是常量)或者调用接口方法的时候,才会导致接口初始化
  • 调用ClassLoader类的loadClass方法类装载一个类,并不会初始化这个类,因为不是对类的主动使用
类初始化时机
  • java程序对类的使用方式分成主动使用和被动使用,jvm必须在每个类或接口"首次主动使用"时,才初始化他们;被动使用类不会导致类的初始化
  • 主动使用的常见情形
  • 创建类实例
  • 访问某个类的静态变量
  • 调用类的静态方法
  • 反射某个类(Class.forName("类完全限定名"))
  • 初始化某个类的子类,而此时该类还没有初始化时
  • jvm启动时运行的主类
  • 定义了default方法的接口,当接口实现类初始化时
  • 被动使用的常见情形
  • 通过子类引用父类的静态字段,此时子类即为被动使用的情形,不会导致子类初始化
  • 通过数组定义类引用类,不会导致类初始化,例如MyChild[] mcs = new MyChild[2];不会导致MyChild被初始化
  • 访问常量不会导致类初始化
注意
  • 以上提到关于常量访问会不会导致类初始化时有分歧,原因是常量分为两种类型
  • 编译时常量,包括基础数据类型和String类型的字面量(常量池中只能引用到基本类型和String类型的字面量),这种类型的常量在编译时就会被放入常量池中,对这种类型的常量进行引用时,不会导致类的初始化
  • 运行时常量,包括其他的引用类型的常量,这种类型的常量在运行时才会被放入常量池中,对这种类型的常量进行引用时,会导致类的初始化
  • 并不是所有类都有<clinit>方法,满足以下条件之一的类不会拥有<clinit>方法
  • 该类既没有声明任何类型的变量,也没有静态初始化语句(静态块)
  • 该类声明了静态变量,但没有明确使用静态初始化语句或静态初始化语句块
  • 该类仅包含常量,且常量为基本数据类型或者String类型

实例对象初始化

  • 实例对象初始化实际是执行<init>方法的过程,其执行的时期为对象的初始化阶段,一个类有几个构造器就有几个<init>方法,每次创建实例对象,都会调用对应的<init>方法,该方法同样由jvm进行调用,<init>方法由非静态实例属性显示赋值语句和非静态代码块以及对应的构造函数组成,其执行顺序也是自上而下顺序执行,但构造器的语句最后执行
  • 实例化对象的四种途径
  • 调用new操作符
  • 调用Class或java.lang.reflect.Constructor对象的newInstance方法
  • 调用任何现有对象的clone()方法
  • 通过java.io.ObjectInputStream类的getObject方法反序列化

IO流

IO流分类

  • 按数据流的方向:输入流、输出流
  • 按处理数据单位:字节流、字符流
  • 按功能:节点流、处理流

字节流一般用来处理图像、视频、音频、PPT、Word等类型的文件。字符流一般用于处理纯文本类型的文件,如TXT文件等,但不能处理图像视频等非文本文件。用一句话说就是:字节流可以处理一切文件,而字符流只能处理纯文本文件

常用节点流

类型字符流字节流
File(文件)FileReader、FileWriterFileInputStream、FileOutputStream
Memory ArrayCharArrayReader、CharArrayWriterByteArrayInputStream、ByteArrayOutputStream
Memory StringStringReader、StringWriter-
Pipe(管道)PipedReader、PipedWriterPipedInputStream、PipedOutputStream

常用处理流

处理类型字符流字节流
Buffering(缓冲)BufferedReader、BufferedWriterBufferedInputStream、BufferedOutputStream
Filtering(过滤)FilterReader、FilterWriterFilterInputStream、FilterOutputStream
Converting between bytes and character(字节字符转换)InputStreamReader、OutputStreamWriter-
Object Serialization(对象序列化)-ObjectInputStream、ObjectOutputStream
Data Conversion(数据转换)-DataInputStream、DataOutputStream
Counting(计数)LineNumberReaderLineNumberInputStream
Peeking aheadPusbackReaderPusbackInputStream
Printing(打印)PrintWriterPrintStream

Servlet

Servlet

在非分布式的单节点部署情况下,Servlet只会在第一次请求的时候创建对象,即只会new一次,同时,init初始化方法也只会执行一次

Application

  • 用于保存整个WebApplication的生命周期内都可以访问的数据
  • 在Api中表现为ServletContext
  • 通过HttpServlet的getServletContext方法可以拿到
  • 通过ServletContext的get/setAttribute方法获取/设置相关属性

Web Application

  • Web Application具有固定的结构,如下所示
Web Application Name
  WEB-INF
    web.xml           该web app的配置文件
    lib(可以没有)      该web app用到的库文件
    classes(可以没有)  存放编译好的servlet文件
  META-INF(可以没有)   存放该web app的上下文信息,符合J2EE标准
  • Web Application可以直接放在webapp下面,也可以通过配置文件指定到其他的目录
<Context path=“虚拟路径名” docBase=“目录位置” debug=“0” reloadable=“true”/>
  • WEB-INF文件夹下的静态文件不能直接访问,如果需要访问可以将静态文件直接放在Web Application根路径下
  • 设置了生存周期,写在txt文件里面的,浏览器关掉时不会清除
  • 没有设置生存周期,写在内存里面的,浏览器关掉时,被清除

Session

  • 如果浏览器支持Cookie,创建Session时会把Session保存在Cookie里
  • 如果浏览器不支持Cookie,必须手动编码设置,使用URL重写的方式实现Session,即将sessionId写到url地址里面
  • 同一个application下的servlet可以共享同一个session,前提是同一个客户端窗口

常用Web服务器

  • IIS
  • Apache
  • Tomcat
  • Tomcat目录结构
    -bin: 可执行的脚步程序
    -conf: 配置文件目录
    -logs: 日志目录
    -server: 服务器所需的类库目录
    -lib: Web App共享的类库
    -webapps: Web应用所存放的目录applications
    -work: Tomcat工作目录(classes文件等)
    -temp: 临时产生的文件
  • Tomcat配置文件
    -conf/server.xml:服务器的主配置文件
    -conf/web.xml:定义所有web应用的配置
    -conf/tomcat-user.xml:定义了tomcat用户的信息

HashMap,Hashtable,ConcurrentHashMap和synchronizedMap的区别

  • HashMap内部的Node数组默认的大小是16,当储存数据超过此限制时,需要扩容(Java7的扩容机制会造成死循环,导致cpu使用率接近100%)
  • HashTable线程安全,源码中使用了synchronized来保证线程安全
  • ConcurrentHashMap:利用cas算法实现实现线程安全,同时效率最高
  • SynchronizedMap:大量使用synchronized来保证线程安全

mybatis中"#"和"$"的区别

  • #{} 和 ${} 在预编译中的处理是不一样的。#{} 在预处理时,会把参数部分用一个占位符 ? 代替,而 ${} 则只是简单的字符串替换,${} 会导致 sql 注入的问题