Java Comparable, Comparator

Comparable Comparable 是排序接口。 若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort (或 Arrays.sort)进行排序。 此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。 Comparable 定义 Comparable 接口仅仅只包括一个函数,它的定义如下: package java.lang; import java.util.*; public interface Comparable<T> { public int compareTo(T o); } 说明: 假设我们通过 x.compareTo(y) 来“比较x和y的大小”。若返回“负数”,意味着“x比y小”;返回“零”,意味着“x等于y”;返回“正数”,意味着“x大于y”。 Comparator 简介 Comparator 是比较器接口。 我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。 也就是说,我们可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。 Comparator 定义 Comparator 接口仅仅只包括两个个函数,它的定义如下: package java.util; public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); } 说明: (01) 若一个类要实现Comparator接口:它一定要实现compareTo(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。 ...

Created 1016-12-01 · Updated 9096-10-09 · 1 min · 114 words · -

Linux Bridge 网桥实现分析

网桥 作者: kendo(http://www.skynet.org.cn/) 第一部份 源码框架 一、网桥原理 传统的中继器,如HUB,是一个单纯的物理层设备,它将每一个收到的数据包,在其所有的端口上广播,由接收主机来判断这个数据包是否是给自己的。这样,网络资源被极大的浪费掉了。 网桥之所以不同于中继器,主要在于其除了有中继的作用外,还有一个更重要的作用,就是学习MAC地址,然后根据每个数据包的目的MAC与自身端口的对应,从关联端口发送数据,而不完全地在整个网段中进行广播。所以,网桥的实现中,有两个关键点: 学习MAC地址,起初,网桥是没有任何地址与端口的对应关系的,它发送数据,还是得想HUB一样,但是每发送一个数据,它都会关心数据包的来源MAC是从自己的哪个端口来的,由于学习,建立地址-端口的对照表 (CAM表) 。 每发送一个数据包,网桥都会提取其目的MAC地址,从自己的地址-端口对照表(CAM表)中查找由哪个端口把数据包发送出去。 网桥的功能在延长网络跨度上类似于中继器,然而它能提供智能化连接服务,即根据帧的终点地址处于哪一网段来进行转发和滤除。网桥对站点所处网段的了解是靠"自学习"实现的。 当使用网桥连接如图2所示的两段LAN时,网桥对来自网段1的MAC帧,首先要检查其终点地址。如果该帧是发往网段1上某一站的,网桥则不将帧转发到网段2,而将其滤除;如果该帧是发往网段2上某一站的,网桥则将它转发到网段2。这表明,如果LAN1和LAN2上各有一对用户在本网段上同时进行通信,显然是可以实现的。因为网桥起到了隔离作用。可以看出,网桥在一定条件下具有增加网络带宽的作用。 网桥的存储和转发功能与中继器相比有优点也有缺点,其优点是: .使用网桥进行互连克服了物理限制,这意味着构成LAN的数据站总数和网段数很容易扩充。 .网桥纳入存储和转发功能可使其适应于连接使用不同MAC协议的两个LAN。 因而构成一个不同LAN混连在一起的混合网络环境。 .网桥的中继功能仅仅依赖于MAC帧的地址,因而对高层协议完全透明。 .网桥将一个较大的LAN分成段,有利于改善可靠性、可用性和安全性。 网桥的主要缺点是: .由于网桥在执行转发前先接收帧并进行缓冲, 与中继器相比会引入理多时延。 .由于网桥不提供流控功能,因此在流量较大时有可能使其过载, 从而造成帧的丢失。 网桥的优点多于缺点正是其广泛使用的原因。 网桥将两个相似的网络连接起来,并对网络数据的流通进行管理。它工作于数据链路层,不但能扩展网络的距离或范围,而且可提高网络的性能、可靠性和安全性。网络1 和网络2 通过网桥连接后,网桥接收网络1 发送的数据包,检查数据包中的地址,如果地址属于网络1 ,它就将其放弃,相反,如果是网络2 的地址,它就继续发送给网络2.这样可利用网桥隔离信息,将同一个网络号划分成多个网段 (属于同一个网络号) ,隔离出安全网段,防止其他网段内的用户非法访问。由于网络的分段,各网段相对独立 (属于同一个网络号) ,一个网段的故障不会影响到另一个网段的运行。 网桥可以是专门硬件设备,也可以由计算机加装的网桥软件来实现,这时计算机上会安装多个网络适配器 (网卡) 。 网桥的功能在延长网络跨度上类似于中继器,然而它能提供智能化连接服务,即根据帧的终点地址处于哪一网段来进行转发和滤除。网桥对站点所处网段的了解是靠"自学习"实现的,有透明网桥、转换网桥、封装网桥、源路由选择网桥。 当使用网桥连接两段LAN 时,网桥对来自网段1 的MAC 帧,首先要检查其终点地址。如果该帧是发往网段1 上某一站的,网桥则不将帧转发到网段2 ,而将其滤除;如果该帧是发往网段2 上某一站的,网桥则将它转发到网段2,这表明,如果LAN1和LAN2上各有一对用户在本网段上同时进行通信,显然是可以实现的。 因为网桥起到了隔离作用。可以看出,网桥在一定条件下具有增加网络带宽的作用。 网桥的存储和转发功能与中继器相比有优点也有缺点,其优点是: 使用网桥进行互连克服了物理限制,这意味着构成LAN 的数据站总数和网段数很容易扩充。 网桥纳入存储和转发功能可使其适应于连接使用不同MAC 协议的两个LAN,因而构成一个不同LAN 混连在一起的混合网络环境。 网桥的中继功能仅仅依赖于MAC 帧的地址,因而对高层协议完全透明。 网桥将一个较大的LAN 分成段,有利于改善可靠性、可用性和安全性。 网桥的主要缺点是: 由于网桥在执行转发前先接收帧并进行缓冲,与中继器相比会引入更多时延。由于网桥不提供流控功能,因此在流量较大时有可能使其过载,从而造成帧的丢失。 网桥的优点多于缺点正是其广泛使用的原因。 网桥工作在数据链路层,将两个LAN连起来,根据MAC地址来转发帧,可以看作一个"低层的路由器" (路由器工作在网络层,根据网络地址如IP地址进行转发) 。 远程网桥通过一个通常较慢的链路 (如电话线) 连接两个远程LAN,对本地网桥而言,性能比较重要,而对远程网桥而言,在长距离上可正常运行是更重要的。 网桥与路由器的比较 网桥并不了解其转发帧中高层协议的信息,这使它可以同时以同种方式处理IP、IPX等协议,它还提供了将无路由协议的网络 (如NetBEUI) 分段的功能。 由于路由器处理网络层的数据,因此它们更容易互连不同的数据链路层,如令牌环网段和以太网段。网桥通常比路由器难控制。像IP等协议有复杂的路由协议,使网管易于管理路由;IP等协议还提供了较多的网络如何分段的信息 (即使其地址也提供了此类信息) 。而网桥则只用MAC地址和物理拓扑进行工作。因此网桥一般适于小型较简单的网络。 ...

Created 4046-12-04 · Updated 9096-10-09 · 2 min · 218 words · -

Emacs org-mode TODO 状态

emacs org-mode TODO状态 https://qiwulun.github.io/posts/org-mode%E5%B8%B8%E7%94%A8%E5%8A%9F%E8%83%BD%EF%BC%8D%EF%BC%8DTODO%E7%8A%B6%E6%80%81%E4%B8%8E%E5%A4%8D%E9%80%89%E6%A1%86.html org-mode常用功能--TODO状态与复选框 快捷键 t 将当前项的状态在 (unmarked) ->TODO->DONE 之间循环切换 =,/= 各种稀疏树的检索形式 =,T= / C-c / t 在稀疏树中显示 TODO 项,同时显示 TODO 项和它们所在的层次的标题 =, a t= / SPC a o t (agenda) 显示全局 TODO 列表,将从所有的议程文件中收集 TODO 项到一个缓冲区中 S-M-RET 在当前项下插入一个新的 TODO 项 格式 定义 用 TODO 关键字来定义不同的状态,用以处理项,比如: (setq org-todo-keywords '((sequence "TODO" "FEEDBACK" "VERIFY" "|" "DONE" "DELEGATED"))) 竖直线将 TODO 关键字 (还需要进一步的动作) 和 DONE 状态 (不需要进一步的动作) 分隔开。如果你不给出竖直线,最后一个状态会作为 DONE 状态。设置之后,C-c C-t 就会将状态从 TODO 转换到 FEEDBACK,再转换到 VERIFY,最后到 DONE 和 DELEGATED。 ...

Created 11116-12-11 · Updated 9096-10-09 · 7 min · 1310 words · -

KVM 的 USB 支持

KVM的USB支持 在启动KVM的时候,加入参数 -usb, 同时还要加入 -usbdevice host:<VendorID>:<ProductID>。 将 USB VendorID 和 ProductID 传给虚拟机,这样虚拟机就会知道有一个 USB设备插入了。 例如: #sudo kvm -usb -usbdevice host:VendorID:ProductID winxp.img $sudo kvm -usb -usbdevice host:08ec:2039 winxp.img 如何知道VendorID:ProductID,通过lsusb命令: unanao@debian:~/Image$ lsusb Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 006 Device 002: ID 163c:0620 Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub ID后面的 xxxx:xxxx 就是 <VendorID>:<ProductID>。如要挂载第2行的USB设备: ...

Created 14146-12-14 · Updated 9096-10-09 · 1 min · 152 words · -

Linux 命令 exit, 退出当前 shell

Linux命令之exit – 退出当前shell 本文链接: http://codingstandards.iteye.com/blog/836625 (转载请注明出处) 用途说明 exit命令用于退出当前shell,在shell脚本中可以终止当前脚本执行。 常用参数 格式: exit n 退出。设置退出码为n。 (Cause the shell to exit with a status of n.) 格式: exit 退出。退出码不变,即为最后一个命令的退出码。 (If n is omitted, the exit status is that of the last command executed. ) 格式: $? 上一个命令的退出码。 格式: trap “commands” EXIT 退出时执行commands指定的命令。 ( A trap on EXIT is executed before the shell terminates.) 退出码 (exit status,或exit code) 的约定: 0表示成功 (Zero - Success) 非0表示失败 (Non-Zero - Failure) ...

Created 26266-12-26 · Updated 9096-10-09 · 2 min · 380 words · -

openJPA enhancement error

openJPA enhancement error <openjpa-2.1.1-r422266:1148538 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: This configuration disallows runtime optimization, but the following listed types were not enhanced at build time or at class load time with a javaagent: " com.wiloon.openjpa.entity.Animal". add line : <property name="openjpa.RuntimeUnenhancedClasses" value="supported" /> in persistence.xml 维护记录 时间 修改内容 原因 2026-10-09 修复本地 Hugo 构建的 Raw HTML 警告:代码/配置放入代码块,正文中的尖括号占位符改为行内代码;categories 改为 Java 正文中的 HTML/XML 片段被当作原始 HTML 丢弃;文件名/URL/标题按规范调整

Created 28286-12-28 · Updated 9096-10-09 · 1 min · 61 words · -

Dsniff

Dsniff Dsniff 是一个著名的网络嗅探工具包。其开发者Dug Song早在1999年12月,以密歇根大学CITI研究室 (Center for Information Technology Integration) 的研究成果为基础,开发了这个后来具有很大影响力的网络安全工具包。Dug Song开发Dsniff的本意是揭示网络通信的不安全性,借助这个工具包,网络管理员可以对自己的网络进行审计,也包括渗透测试。但万事总有其两面 性,Dsniff所带来的负面作用也是"巨大"的,首先它是可以自由获取的,任何拥有这个工具包的人都可能做"非正当"的事,其次,Dsniff里面的某 些工具,充分揭示了一些安全协议的"不安全性",例如针对SSH1和SSL的MITM (Man-In-The-Middle) 攻击工具—SSHmitm和 Webmitm。SSH1和SSL都是建立网络通信加密通道的机制,向来被认为是很安全的,但人们在具体使用时,往往因为方便性上的考虑而忽视了某些环 节,造成实事上的不安全。所以说,最大的不安全性,往往并不在于对安全的一无所知,而在于过于相信自己的安全。 Dub Song在2000年12月发布了Dsniff的v2.3版本,该版本支持OpenBSD、Linux、Solaris系统平台。目前,最新版本是 2001年3月发布的v2.4b1的Beta版 除了针对Unix系统的版本,从网上也可以得到Windows平台上运行的Dsniff早期版 作为一个工具集,dsniff包括的工具分为四类: 纯粹被动地进行网络活动监视的工具,包括: dsniff、filesnarf、mailsnarf 、msgsnarf、urlsnarf、webspy 针对SSH和SSL的MITM (Man-In-The-Middle) “攻击"工具,包括sshmitm和webmitm 发起主动欺骗的工具,包括: arpspoof、dnsspoof、macof 其它工具,包括tcpkill、tcpnice dsniff的安装 sudo pacman -S dsniff 安装完成后,默认 dsniff 的安装目录是 /usr/local/sbin,在这里可以看到 dsniff 所有的工具 dsniff工具介绍 纯粹被动地进行网络活动监视的工具,包括: dsniff、filesnarf、mailsnarf 、msgsnarf、urlsnarf、webspy 针对SSH和SSL的MITM (Man-In-The-Middle) “攻击"工具,包括sshmitm和webmitm 发起主动欺骗的工具,包括: arpspoof、dnsspoof、macof 其它工具,包括tcpkill、tcpnice dsniff dsniff 是一个密码侦测工具,他能够自动分析端口上收到的某些协议的数据包,并获取相应的密码。 dnisff 支持的协议有 FTP, Telnet, SMTP, HTTP, POP, poppass, NNTP, IMAP, SNMP, LDAP, Rlogin, RIP, OSPF, PPTP MS-CHAP, NFS, VRRP, YP/NIS, SOCKS, X11, CVS, IRC, AIM, ICQ, Napster, PostgreSQL, Meeting Maker, Citrix ICA, Symantec pcAnywhere, NAI Sniffer, Microsoft SMB, Oracle SQL*Net, Sybase and Microsoft SQL。 ...

Created 8086-01-08 · Updated 9096-10-09 · 2 min · 360 words · -

ubuntu vnc

ubuntu vnc 第一步,获取安装文件 sudo apt-get install vnc4server 第二步,修改VNC Password,不能太短 # vncpasswd Password: ** Verify:***** 第三步,检查防火墙,这个就不详细说明了 第四步,启动VNC server vncserver 第五步,通过客户端连接 地址后面加:1 启动完vnc4server后在你的主目录下将会产生一个.vnc的目录。 此时就可以通过vnc客户端链接到服务器了。 停止一个vnc4server vnc4server -kill :3 根据你启动时获得的数字替换此处的3。 打开 .vnc/xstartup 文件并编辑: gedit /.vnc/xstartup 文件看起来将是这样的: #!/bin/sh # Uncomment the following two lines for normal desktop: # unset SESSION_MANAGER # exec /etc/X11/xinit/xinitrc [ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources xsetroot -solid grey vnccon** -iconic & x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" & x-window-manager & 修改 .vnc/xstartup文件并保存 取消unset和exec开始的行的注释,注释以xsetroot,vnccon**,xterm和twm开始的行。执行后看起来像这样: ...

Created 20206-01-20 · Updated 9096-10-09 · 2 min · 413 words · -

HTML5 中 div section article 的区别

HTML5 中 div section article 的区别 div HTML Spec: “The div element has no special meaning at all.” 这个标签是我们见得最多、用得最多的一个标签。本身没有任何语义,用作布局以及样式化或脚本的钩子(hook)。 section HTML Spec: “The section element represents a generic section of a document or application. A section, in this context, is a thematic grouping of content, typically with a heading.” 与 div 的无语义相对,简单地说 section 就是带有语义的 div 了,但是千万不要觉得真得这么简单。section 表示一段专题性的内容,一般会带有标题。看到这里,我们也许会想到,那么一篇博客文章,或者一条单独的评论岂不是正好可以用 section 吗?接着看: “Authors are encouraged to use the article element instead of the section element when it would make sense to syndicate the contents of the elemen.” ...

Created 19196-02-19 · Updated 9096-10-09 · 3 min · 539 words · -

CSS 垂直居中

css垂直居中 单行内容的居中 只考虑单行是最简单的,无论是否给容器固定高度,只要给容器设置 line-height 和 height,并使两值相等,再加上 over-flow: hidden 就可以了 [css] .middle-demo-1{ height: 4em; line-height: 4em; overflow: hidden; } [/css] 优点: 同时支持块级和内联极元素 支持所有浏览器 缺点: 只能显示一行 IE 中不支持 <img> 等的居中 要注意的是: 使用相对高度定义你的 height 和 line-height 不想毁了你的布局的话,overflow: hidden 一定要加上。 维护记录 时间 修改内容 原因 2026-10-09 修复本地 Hugo 构建的 Raw HTML 警告:代码/配置放入代码块,正文中的尖括号占位符改为行内代码;文件重命名为 css-vertical-center.md;title 改为「CSS 垂直居中」;url 改为 css-vertical-center;旧 url 加入 aliases 正文中的 HTML/XML 片段被当作原始 HTML 丢弃;文件名/URL/标题按规范调整

Created 25256-02-25 · Updated 9096-10-09 · 1 min · 60 words · -

Spring 的静态工厂方法

Spring的静态工厂方法 http://blog.csdn.net/chensugang/article/details/3357593 上一次写了一篇关于DI的三种方式,其中里面介绍了构造方法的方式,今天学习了一种替代构造器的方法,这就是静态工厂方法来返回对象,下面来看一下静态工厂方法的实现。 静态工厂方法: LoginAction类: package com.spring.test.di; public class LoginAction { private Logic logic; private LoginAction(Logic logic){ this.logic = logic; } public static LoginAction createInstance(Logic logic){ LoginAction loginAction = new LoginAction (logic); return loginAction; } public void execute() { String name = logic.getName(); System.out.print("My Name Is " + name); } } 注意: 这里使用的构造方法是一个私有方法,createInstance这个就是我们的静态工厂方法 Logic接口: package com.spring.test.di; public interface Logic { public String getName(); } 这里只是做为一个简单的例子,所以我们在该接口中只有一个方法,并且在该接口的实现方法也超级简单 ...

Created 26266-03-26 · Updated 9096-10-09 · 1 min · 170 words · -

MANIFEST.MF

字段速查 MANIFEST.MF 是 jar 的清单文件,位于 META-INF/ 下,声明 jar 的入口、classpath 等元数据。常用字段: 字段 说明 Manifest-Version manifest 格式版本,通常 1.0 Main-Class java -jar 时 JVM 执行的入口类 Class-Path 运行时需要的外部 jar 路径 Start-Class Spring Boot 专有:真正的应用主类(此时 Main-Class 指向 loader 的 JarLauncher) 格式规则(容易踩坑): 每行 Key: Value,冒号后一个空格 每行最长 72 字节,超长的值需换行并以一个前导空格续行 文件必须以空行结尾,否则最后一个属性会被静默忽略 Spring Boot 可执行 JAR 中 Main-Class / Start-Class 的分工,以及 JVM 如何读取 manifest 启动应用,见 Spring Boot Executable JAR。 历史 规范:Java JAR File Specification,属 Java SE 标准,由 Oracle(原 Sun)维护 jar 格式基于 ZIP;META-INF/MANIFEST.MF 在最初的 jar 规范里就被强制要求 年份 事件 1996 JDK 1.0,尚无 jar 格式 1997 JDK 1.1 引入 jar 与 MANIFEST.MF 1999 JDK 1.2 扩展签名、sealed package 等 至今 核心结构未变;Spring Boot 等框架在其上追加自定义属性 完整字段说明(历史整理) 打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录,这个目录下会有一些文件,其中必有一个MANIFEST.MF,这个文件描述了该Jar文件的很多信息,下面将详细介绍MANIFEST.MF文件的内容,先来看struts.jar中包含的MANIFEST.MF文件内容: ...

Created 8086-04-08 · Updated 9096-10-09 · 2 min · 273 words · -

Maven内置属性、POM属性

Maven内置属性、POM属性 Maven内置属性、POM属性, maven properties 内置属性(Maven预定义,用户可以直接使用) ${basedir}表示项目根目录,即包含pom.xml文件的目录; ${version}表示项目版本; ${project.basedir}同${basedir}; ${project.baseUri}表示项目文件地址; ${maven.build.timestamp}表示项目构件开始时间; ${maven.build.timestamp.format}表示属性${maven.build.timestamp}的展示格式,默认值为yyyyMMdd-HHmm,可自定义其格式,其类型可参考java.text.SimpleDateFormat。 用法: <properties> <maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss</maven.build.timestamp.format> </properties> POM属性(使用pom属性可以引用到pom.xml文件对应元素的值) ${project.build.directory} 项目构建输出目录,默认为target/ ${project.build.outputDirectory} 项目主代码编译输出目录,默认为target/classes/ ${project.build.testOutputDirectory}:项目测试代码编译输出目录,默认为target/testclasses/ ${project.build.sourceEncoding} 表示主源码的编码格式; ${project.build.sourceDirectory} 项目的主源码目录,默认为src/main/java/ ${project.build.testSourceDirectory} 项目的测试源码目录,默认为/src/test/java/ ${project.build.finalName} 表示输出文件名称; ${project.version} 表示项目版本,与${version}相同; ${project.groupId}:项目的groupId ${project.artifactId} 项目的artifactId 用法: <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> ${project.build.outputDirectory}/META-INF/xxx/xxx 维护记录 时间 修改内容 原因 2026-10-09 修复本地 Hugo 构建的 Raw HTML 警告:代码/配置放入代码块,正文中的尖括号占位符改为行内代码 正文中的 HTML/XML 片段被当作原始 HTML 丢弃;文件名/URL/标题按规范调整

Created 9096-04-09 · Updated 9096-10-09 · 1 min · 56 words · -

Class 文件内容, 方法区, 常量池

Class 文件内容, 方法区, 常量池 当JVM运行Java程序的时候,它会加载对应的 class文件,并提取class文件中的信息存放在JVM开辟出来的方法区内存中。那么这个 class 文件里面到底有些什么内容呢? 一、class文件内容概述 class文件是由8bits的字节流组成,全部字节构成了15个有意义的项目。这些项目之间没有任何无意义的字节,因此class文件非常紧凑。占据多字节空间的项目按照高位在前的顺序存放。下面我们详细讨论这些项目: magic (魔数) 每个class文件的前4个字节称为魔数,值为 0xCAFEBABE。作用在于轻松的辨别class文件与非class文件。 minor_version、major_version(次、主版本号) 各占2个字节。随着Java技术的发展,class文件的格式会发生变化。版本号的作用在于使得虚拟机能够认识当前加载class的文件格式。从而准确的提取class文件信息。 constant_pool_count 、constance_pool (常量池) 从这里开始的字节组成了常量池 。 存储了诸如符号常量、final常量值、基本数据类型的字面值等内容。JVM会将每一个常量构成一个常量表,每个常量表都有自己的入口地址。而实际上在JVM会将这些常量表存储在方法区中一块连续的内存空间中,因此class文件会根据常量表在常量池中的位置对其进行索引。比如常量池中的第一个常量表的索引值就是1,第二个就是2。有的时候常量表A需要常量表B的内容,则在常量表A中会存储常量表B的索引值x。而 constant_pool_count 就记录了有多少个常量表,或者所有多少个索引值。实际上,常量池中没有索引值为0的常量表,但这缺失的索引值也被记录在constant_pool_count中,因此 constant_pool_count等于常量表的数量加1。关于常量池的具体内容,我们会在下面详细讲述,并用一个例子来显示整个class文件的内容。 access_flags(访问标志) 占用2个字节。用来表明该class文件中定义的是类还是接口,访问修饰符是public还是缺省。类或接口是否是抽象的。类是否是final的。 this_class 占用2个字节。 它是一个对常量池的索引。指向的是常量池中存储类名符号引用的CONSTANT_Class_info常量表(见下面常量池具体结构)。比如this_class=0x0001。则表示指向常量池中的第一个常量表。通常这个表是指向当前class文件所定义的类名。 super_class 占用2个字节 与this_class类似,指向存放当前class文件所定义类的超类名字的索引的CONSTANT_Class_info常量表。 inteface_count、interfaces interface_count 是class文件所定义的类直接实现的接口或父类实现的接口的数量。占2个字节。intefaces包含了对每个接口的 CONSTANT_Class_info常量表的索引。 fields_count、fields fields_count 表明了类中字段的数量 。fields是不同长度的field_info表的序列。这些field_info表中并不包含超类或父接口继承而来的字段。field_info表展示了一个字段的信息,包括字段的名字,描述符和修饰符。如果该字段是final的,那么还会展示其常量值。注意,这些信息有些存放在field_info里面,有些则存放在field_info所指向的常量池中。下面我们阐述一下这个field_info表的格式: access_flags(2byte 访问修饰符) name_index(2byte 存储字段名的常量表在常量池中的索引) description_index(2byte 存储字段的所属类型的常量表在常量池中的索引) attribute_count(2byte 属性表的数量) attribute (属性) 其中attribute是由多个attribute_info组成。而JVM规范定义了字段的三种属性: ConstanceValue、Deprecated和Synthetic。 method_count、methods 与字段类似,method_count表明类中方法的数量和每个方法的常量表的索引。methods表明了不同长度的method_info表的序列。该表格式如下: access_flags(2byte 访问修饰符) name_index(2byte 存储方法名的常量表在常量池中的索引) description_index(2byte 存储方法的返回类型和参数类型的常量表在常量池中的索引) attribute_count(2byte 属性表的数量) attribute (属性) 其中方法的属性JVM规定了四种: Code,Deprecated,Exceptions,Synthetic。 常量池的具体结构 在Java程序中,有很多的东西是永恒的,不会在运行过程中变化。比如一个类的名字,一个类字段的名字/所属类型,一个类方法的名字/返回类型/参数名与所属类型,一个常量,还有在程序中出现的大量的字面值。比如下面小段源码红色显示的东西。 public class ClassTest { ...

Created 15156-04-15 · Updated 9096-10-09 · 7 min · 1388 words · -

两个 Tomcat 同时运行时修改 Tomcat 端口

当装了两个tomcat后,修改tomcat端口 http://zfsn.iteye.com/blog/669901 修改Tomcat的端口号: 在默认情况下,tomcat的端口是8080,如果出现8080端口号冲突,用如下方法可以修改Tomcat的端口号: 首先: 在Tomcat的根 (安装) 目录下,有一个conf文件夹,双击进入conf文件夹,在里面找到Server.xml文件,打开该文件。 其次: 在文件中找到如下文本: <Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" /> 也有可能是这样的: <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" /> 等等; 最后: 将 port="8080" 改为其它的就可以了。如 port="8081" 等。保存 server.xml 文件,重新启动 Tomcat 服务器,Tomcat 就可以使用 8081 端口了。 注意,有的时候要使用两个 tomcat,那么就需要修改其中的一个的端口号才能使得两个同时工作。 修改了上面的以后,还要修改两处: 将 <Connector port="8009" enableLookups="false" redirectPort="8443" debug="0" protocol="AJP/1.3" /> 的 8009 改为其它的端口。 继续将 <Server port="8005" shutdown="SHUTDOWN" debug="0"> 的 8005 改为其它的端口。 经过以上 3 个修改,应该就可以了。 8443 维护记录 时间 修改内容 原因 2026-10-09 修复本地 Hugo 构建的 Raw HTML 警告:代码/配置放入代码块,正文中的尖括号占位符改为行内代码;文件重命名为 tomcat-port.md;title 改为「两个 Tomcat 同时运行时修改 Tomcat 端口」;url 改为 tomcat-port;旧 url 加入 aliases 正文中的 HTML/XML 片段被当作原始 HTML 丢弃;文件名/URL/标题按规范调整

Created 13136-05-13 · Updated 9096-10-09 · 1 min · 97 words · -

Tomcat Port 8009 与 AJP13 协议

Tomcat Port 8009 与AJP13协议 由于tomcat的html和图片解析功能相对其他服务器如apche等较弱,所以,一般都是集成起来使用,只有jsp和servlet服务交由tomcat处理,而tomcat和其他服务器的集成,就是通过ajp协议来完成的。 AJP13(Apache JServ Protocol version 1.3)是定向包协议。因为性能原因,使用二进制格式来传输可读性文本。WEB服务器通过TCP连接和SERVLET容器连接。为了减少进程生成 socket的花费,WEB服务器和SERVLET容器之间尝试保持持久性的TCP连接,对多个请求/回复循环重用一个连接。一旦连接分配给一个特定的请 求,在请求处理循环结束之前不会在分配。换句话说,在连接上,请求不是多元的。这个是连接两端的编码变得容易,虽然这导致在一时刻会有很多连接。 一旦WEB服务器打开了一个到SERVLET容器的连接,连接处于下面的状态: ◆ 空闲 这个连接上没有处理的请求。 ◆ 已分派 连接正在处理特定的请求。 一旦一个连接被分配给一个特定的请求,在连接上发送的基本请求信息是高度压缩的。在这点,SERVLET容器大概准备开始处理请求,当它处理的时候,它能发回下面的信息给WEB服务器: ◆ SEND_HEADERS 发送一组头到浏览器。 ◆ SEND_BODY_CHUNK 发送一块主体数据到浏览器。 ◆ GET_BODY_CHUNK 从请求获得下一个数据如果还没有全部传输完,如果请求内容的包长度非常大或者长度不确定,这是非常必要的。例如上载文件。注意这和HTTP的块传输没有关联。 ◆ END_RESPONSE 结束请求处理循环。 Tomcat服务器通过Connector连接器组件与客户程序建立连接,Connector组件负责接收客户的请求,以及把Tomcat服务器的响应结果发送给客户。默认情况下,Tomcat在server.xml中配置了两种连接器: <!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8080 --> <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" /> <!-- Define a Coyote/JK2 AJP 1.3 Connector on port 8009 --> <Connector port="8009" enableLookups="false" redirectPort="8443" debug="0" protocol="AJP/1.3" /> 第一个连接器监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。 第二个连接器监听8009端口,负责和其他的HTTP服务器建立连接。在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。 Web客户1直接访问Tomcat服务器上的JSP组件,他访问的URL为http://localhost:8080 /index.jsp。Web客户2通过HTTP服务器访问Tomcat服务器上的JSP组件。假定HTTP服务器使用的HTTP端口为默认的80端口, 那么Web客户2访问的URL为http://localhost:80/index.jsp 或者 http://localhost/index.jsp。 摘自: http://hikin.iteye.com/blog/555682 2.http://bbs.163jsp.com/posts/list/472.html http://tomcat.apache.org/connectors-doc-archive/jk2/common/AJPv13.html 维护记录 时间 修改内容 原因 2026-10-09 修复本地 Hugo 构建的 Raw HTML 警告:代码/配置放入代码块,正文中的尖括号占位符改为行内代码;文件重命名为 tomcat-ajp13.md;title 改为「Tomcat Port 8009 与 AJP13 协议」;url 改为 tomcat-ajp13;旧 url 加入 aliases 正文中的 HTML/XML 片段被当作原始 HTML 丢弃;文件名/URL/标题按规范调整

Created 13136-05-13 · Updated 9096-10-09 · 1 min · 113 words · -

readelf

readelf 功能:用于查看ELF格式的文件信息,常见的文件如在 Linux 上的可执行文件,动态库(.so) 或者静态库 (.a) 等包含 ELF 格式的文件。 示例: 查看静态库定义的函数 readelf -c xxx.a 查看静态库定义的函数 readelf -A xxx.so 版权声明:本文为CSDN博主「mayue_csdn」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/mayue_web/article/details/103879976 ELF (Executable and Linkable Format) 即可执行连接文件格式,是一种比较复杂的文件格式,但其应用广泛。当你使用 file 命令发现某个文件是 ELF 文件时,你就可以使用 readelf 命令来读取这个文件的信息。 readelf -h /bin/pwd readelf 命令 用来显示一个或者多个elf格式的目标文件的信息,可以通过它的选项来控制显示哪些信息。这里的elf-file(s)就表示那些被检查的文件。可以支持32位,64位的elf格式文件,也支持包含elf文件的文档 (这里一般指的是使用ar命令将一些elf文件打包之后生成的例如lib*.a之类的“静态库”文件)。 这个程序和 objdump 提供的功能类似,但是它显示的信息更为具体,并且它不依赖BFD库(BFD库是一个GNU项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件),所以即使BFD库有什么bug存在的话也不会影响到readelf程序。 运行 readelf 的时候,除了 -v和 -H之外,其它的选项必须有一个被指定。 ELF文件类型 3种类型的ELF文件: 可重定位文件:用户和其他目标文件一起创建可执行文件或者共享目标文件,例如lib*.a文件。 可执行文件:用于生成进程映像,载入内存执行,例如编译好的可执行文件a.out。 共享目标文件:用于和其他共享目标文件或者可重定位文件一起生成elf目标文件或者和执行文件一起创建进程映像,例如lib*.so文件。 ELF文件作用: ELF文件参与程序的连接(建立一个程序)和程序的执行(运行一个程序),所以可以从不同的角度来看待elf格式的文件: 如果用于编译和链接 (可重定位文件),则编译器和链接器将把elf文件看作是节头表描述的节的集合,程序头表可选。 如果用于加载执行 (可执行文件),则加载器则将把elf文件看作是程序头表描述的段的集合,一个段可能包含多个节,节头表可选。 如果是共享文件,则两者都含有。 ELF文件总体组成: elf文件头描述elf文件的总体信息。包括:系统相关,类型相关,加载相关,链接相关。 系统相关表示:elf文件标识的魔术数,以及硬件和平台等相关信息,增加了elf文件的移植性,使交叉编译成为可能。 类型相关就是前面说的那个类型。 加载相关:包括程序头表相关信息。 链接相关:节头表相关信息。 选项 -a –all 显示全部信息,等价于 -h -l -S -s -r -d -V -A -I. ...

Created 24246-05-24 · Updated 9096-10-09 · 13 min · 2754 words · -

Java 各种数据类型转换

java 各种数据类型转换 String > Double String str="122.202"; double dnum = Double.parseDouble(str); hex > int // 默认hex 大端字节序 int decimal = Integer.parseInt(hexNumber, 16); list > array>set Set<T> mySet = new HashSet<>(Arrays.asList(someArray)); array > set, java 9+ Set<T> mySet = Set.of(someArray); array > set, java 10+ var mySet = Set.of(someArray); int > double Double d = new Double(i) double > int int i = d.intValue(); byte to binary string byte b1 = (byte) 129; String s1 = String.format("%8s", Integer.toBinaryString(b1 & 0xFF)).replace(' ', '0'); System.out.println(s1); // 10000001 date localdatetime Instant instant = date.toInstant(); ZoneId zoneId = ZoneId.systemDefault(); instant.atZone(zoneId).toLocalDateTime(); int > bytes byte[] bytes = ByteBuffer.allocate(4).putInt(i).array(); public static byte[] int2Bytes(int value) { byte[] out = new byte[4]; for (int i = 0; i < 4; i++) { out[i] = (byte) (value >> (8 * (4 - i - 1))); } return out; } public static int bytes2Int(byte[] value) { int out = 0; if (value != null && value.length == 4) { for (int i = 0; i < 4; i++) { out |= (value[i] & 0xFF) << (8 * (4 - i - 1)); } } return out; } value & 0xFF It sets result to the (unsigned) value resulting from putting the 8 bits of value in the lowest 8 bits of result. ...

Created 29296-05-29 · Updated 9096-10-09 · 4 min · 686 words · -

tomcat server.xml

tomcat server.xml http://www.importnew.com/26156.html Tomcat隶属于Apache基金会,是开源的轻量级Web应用服务器,使用非常广泛。server.xml是Tomcat中最重要的配置文件,server.xml的每一个元素都对应了Tomcat中的一个组件;通过对xml文件中元素的配置,可以实现对Tomcat中各个组件的控制。因此,学习server.xml文件的配置,对于了解和使用Tomcat至关重要。 本文将通过实例,介绍server.xml中各个组件的配置,并详细说明Tomcat各个核心组件的作用以及各个组件之间的相互关系。 说明: 由于server.xml文件中元素与Tomcat中组件的对应关系,后文中为了描述方便,“元素"和"组件"的使用不严格区分。 一、一个server.xml配置实例 server.xml位于$TOMCAT_HOME/conf目录下;下面是一个server.xml实例。后文中将结合该实例讲解server.xml中,各个元素的含义和作用;在阅读后续章节过程中,可以对照该xml文档便于理解。 <Server port="8005" shutdown="SHUTDOWN"> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" /> </Host> </Engine> </Service> </Server> 二、server.xml文档的元素分类和整体结构 整体结构 server.xml的整体结构如下: <Server> <Service> <Connector /> <Connector /> <Engine> <Host> <Context /><!-- 现在常常使用自动部署,不推荐配置Context元素,Context小节有详细说明 --> </Host> </Engine> </Service> </Server> 该结构中只给出了Tomcat的核心组件,除了核心组件外,Tomcat还有一些其他组件,下面介绍一下组件的分类。 元素分类 server.xml文件中的元素可以分为以下4类: (1) 顶层元素: <Server>和<Service> <Server>元素是整个配置文件的根元素,<Service>元素则代表一个Engine元素以及一组与之相连的Connector元素。 (2) 连接器: <Connector> <Connector>代表了外部客户端发送请求到特定Service的接口;同时也是外部客户端从特定Service接收响应的接口。 (3) 容器: <Engine><Host><Context> ...

Created 2026-06-02 · Updated 9096-10-09 · 3 min · 536 words · -

Java web 乱码

Java web 乱码 http://www.jb51.net/web/12714.html (一) get提交 1.首先说下客户端 (浏览器) 的form表单用get方法是如何将数据编码后提交给服务器端的吧。 对于get方法来说,都是把数据串联在请求的url后面作为参数,如: http://localhost:8080/servlet?msg=abc (很常见的一个乱码问题就要出现了,如果url中出现中文或其它特殊字符的话,如: http://localhost:8080 /servlet?msg=杭州,服务器端容易得到乱码) ,url拼接完成后,浏览器会对url进行URL encode,然后发送给服务器,URL encode的过程就是把部分url做为字符,按照某种编码方式 (如: utf-8,gbk等) 编码成二进制的字节码,然后每个字节用一个包含3个字符的字符串 “%xy” 表示,其中xy为该字节的两位十六进制表示形式。我这里说的可能不清楚,具体介绍可以看下java.net.URLEncoder。了解了 URL encode的过程,我们能看到2个很重要的问题,第一: 需要URL encode的字符一般都是非ASCII的字符 (笼统的讲) ,再通俗的讲就是除了英文字母以外的文字 (如: 中文,日文等) 都要进行URL encode,所以对于我们来说,都是英文字母的url不会出现服务器得到乱码问题,出现乱码都是url里面带了中文或特殊字符造成的;第二: URL encode到底按照那种编码方式对字符编码?这里就是浏览器的事情了,而且不同的浏览器有不同的做法,中文版的浏览器一般会默认的使用GBK,通过设置浏览器也可以使用UTF-8,可能不同的用户就有不同的浏览器设置,也就造成不同的编码方式,所以很多网站的做法都是先把url里面的中文或特殊字符用 javascript做URL encode,然后再拼接url提交数据,也就是替浏览器做了URL encode,好处就是网站可以统一get方法提交数据的编码方式。 完成了URL encode,那么现在的url就成了ASCII范围内的字符了,然后以iso-8859-1的编码方式转换成二进制随着请求头一起发送出去。这里想多说几句的是,对于get方法来说,没有请求实体,含有数据的url都在请求头里面,之所以用URL encode,我个人觉的原因是: 对于请求头来说最终都是要用iso-8859-1编码方式编码成二进制的101010…..的纯数据在互联网上传送,如果直接将含有中文等特殊字符做iso-8859-1编码会丢失信息,所以先做URL encode是有必要的。 2。服务器端 (tomcat) 是如何将数据获取到进行解码的。 第一步是先把数据用iso-8859-1进行解码,对于get方法来说,tomcat获取数据的是ASCII范围内的请求头字符,其中的请求url里面带有参数数据,如果参数中有中文等特殊字符,那么目前还是URL encode后的%XY状态,先停下,我们先说下开发人员一般获取数据的过程。通常大家都是request.getParameter(“name”)获取参数数据,我们在request对象获得的数据都是经过解码过的,而解码过程中程序里是无法指定,这里要说下,有很多新手说用 request.setCharacterEncoding(“字符集”)可以指定解码方式,其实是不可以的,看servlet的官方API说明有对此方法的解释: Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader().可以看出对于get方法他是无能为力的。那么到底用什么编码方式解码数据的呢,这是tomcat的事情了,默认缺省用的是 iso-8859-1,这样我们就能找到为什么get请求带中文参数为什么在服务器端得到乱码了,原因是在客户端一般都是用UTF-8或GBK对数据 URL encode,这里用iso-8859-1方式URL decoder显然不行,在程序里我们可以直接 ...

Created 3036-06-03 · Updated 9096-10-09 · 1 min · 151 words · -