dd command

dd command 创建指定大小的文件, 生成文件 文件内容为全 0 (因从/dev/zero中读取,/dev/zero为0源) 。但是这样为实际写入硬盘,文件产生速度取决于硬盘读写速度,如果想要产生超大文件,速度很慢。 # 生成一个大小为 5G 的文件 dd if=/dev/zero of=foo.bin bs=1G count=5 # 100M 的文件 dd if=/dev/zero of=foo.bin bs=1M count=100 # 100KB dd if=/dev/zero of=foo.bin bs=1K count=100 # 6个字节的 dd if=/dev/zero of=./foo.bin bs=6 count=1 创建稀疏文件 在某种场景下,我们只想让文件系统认为存在一个超大文件在此,但是并不实际写入硬盘。则可以使用 seek dd of=foo.bin bs=1k seek=5120 count=0 参数 if=FILE : 指定输入文件,若不指定则从标注输入读取。这里指定为 /dev/zero 是Linux的一个伪文件,它可以产生连续不断的 null 流 (二进制的0) of=FILE : 指定输出文件,若不指定则输出到标准输出 bs=BYTES : 每次读写的字节数,可以使用单位 K、M、G 等等。另外输入输出可以分别用 ibs、obs 指定,若使用 bs,则表示是 ibs 和 obs 都是用该参数 count=BLOCKS : 读取的 block 数,block 的大小由 ibs 指定 (只针对输入参数) dd 的主要选项: 指定数字的地方若以下列字符结尾乘以相应的数字: b=512, c=1, k=1024, w=2, xm=number m if=file 输入文件名,缺省为标准输入。 ...

2012-01-02 · 3 min · 439 words · -

Java反射机制

Java反射机制 通过反射取对象的属性值 import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; public class ReflectTest { public static void main(String[] args) { Foo foo = new Foo(); foo.setBar("xxx"); Map map = new HashMap(); map.put("foo", "bar"); foo.setTags(map); Class fooClass = foo.getClass(); System.out.println("name:" + fooClass.getName()); try { Field[] fields = fooClass.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); System.out.println("field: " + field.getName()); Object obj = field.get(foo); System.out.println(obj); } Field field0 = fooClass.getDeclaredField("bar"); System.out.println(field0); } catch (Exception e) { e.printStackTrace(); } } } class Foo { private String bar; private Map<String, String> tags; public void setBar(String bar) { this.bar = bar; } public void setTags(Map tags) { this.tags = tags; } } Reflection 是Java被视为动态 (或准动态) 语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers (诸如public, static 等等) 、superclass (例如Object) 、实现之interfaces (例如Cloneable) ,也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。本文借由实例,大面积示范Reflection APIs。 ...

2012-01-02 · 6 min · 1215 words · -

java this super

java this super 在Java中,this通常指当前对象,super则指父类的。当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便 可以利用this来实现这个目的,当然,this的另一个用途是调用当前对象的另一个构造函数,这些马上就要讨论。如果你想引用父类的某种东西,则非 super莫属。由于this与super有如此相似的一些特性和与生俱来的某种关系,所以我们在这一块儿来讨论,希望能帮助你区分和掌握它们两个。 在一般方法中 最普遍的情况就是,在你的方法中的某个形参名与当前对象的某个成员有相同的名字,这时为了不至于混淆,你便需要明确使用this关键字来指明你要使用某 个成员,使用方法是"this.成员名",而不带this的那个便是形参。另外,还可以用"this.方法名"来引用当前对象的某个方法,但这时this 就不是必须的了,你可以直接用方法名来访问那个方法,编译器会知道你要调用的是那一个。下面的代码演示了上面的用法: public class DemoThis{ private String name; private int age; DemoThis(String name,int age){ setName(name); //你可以加上this来调用方法,像这样: this.setName(name);但这并不是必须的 setAge(age); this.print(); } public void setName(String name){ this.name=name;//此处必须指明你要引用成员变量 } public void setAge(int age){ this.age=age; } public void print(){ System.out.println(“Name="+name+” Age="+age);//在此行中并不需要用this,因为没有会导致混淆的东西 } public static void main(String[] args){ DemoThis dt=new DemoThis(“Kevin”,“22”); } } 这段代码很简单,不用解释你也应该能看明白。在构造函数中你看到用this.print(),你完全可以用print()来代替它,两者效果一样。下面我们修改这个程序,来演示super的用法。 class Person{ public int c; private String name; private int age; protected void setName(String name){ this.name=name; } protected void setAge(int age){ ...

2012-01-02 · 1 min · 191 words · -

java.lang.Class类

java.lang.Class类 Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。 Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。 虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类 (型) 都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。 基本的 Java 类型 (boolean、byte、char、short、int、long、float 和 double) 和关键字 void 也都对应一个 Class 对象。 每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。 一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。 一、如何得到Class的对象呢?有三种方法可以的获取: 调用Object类的getClass()方法来得到Class对象,这也是最常见的产生Class对象的方法。例如: MyObject x; Class c1 = x.getClass(); 使用Class类的中静态forName()方法获得与字符串对应的Class对象。例如: Class c2=Class.forName(“MyObject”),Employee必须是接口或者类的名字。 获取Class类型对象的第三个方法非常简单。如果T是一个Java类型,那么T.class就代表了匹配的类对象。例如 Class cl1 = Manager.class; Class cl2 = int.class; Class cl3 = Double[].class; 注意: Class对象实际上描述的只是类型,而这类型未必是类或者接口。例如上面的int.class是一个Class类型的对象。由于历史原因,数组类型的getName方法会返回奇怪的名字。 二、Class类的常用方法 getName() 一个Class对象描述了一个特定类的属性,Class类中最常用的方法getName以 String 的形式返回此 Class 对象所表示的实体 (类、接口、数组类、基本类型或 void) 名称。 newInstance() Class还有一个有用的方法可以为类创建一个实例,这个方法叫做newInstance()。例如: x.getClass.newInstance(),创建了一个同x一样类型的新实例。newInstance()方法调用默认构造器 (无参数构造器) 初始化新建对象。 ...

2012-01-02 · 2 min · 276 words · -

数组

数组 线性表 (Linear List) 每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表… 数组支持随机访问,根据下标随机访问的时间复杂度为 O(1) 数组简单易用,在实现上使用的是连续的内存空间,可以借助 CPU 的缓存机制,预读数组中的数据,所以访问效率更高。而链表在内存中并不是连续存储,所以对 CPU 缓存不友好,没办法有效预读。 一维数组的声明方式: type var[]; 或type[] var; 声明数组时不能指定其长度 (数组中元素的个数) , Java中使用关键字new创建数组对象,格式为: 数组名 = new 数组元素的类型 [数组元素的个数] 实例: TestNew.java: 程序代码: public class TestNew { public static void main(String args[]) { int[] s ; int i ; s = new int[5] ; for(i = 0 ; i < 5 ; i++) { s[i] = i ; } for(i = 4 ; i >= 0 ; i–) { System.out.println("" + s[i]) ; } } } 初始化: ...

2012-01-02 · 2 min · 256 words · -

Linux存储设备的两种表示方法

Linux存储设备的两种表示方法 作者: 北南南北 LinuxSir.Org 摘要: 硬盘和硬盘分区在Linux都表示为设备,按我们通俗的说法来说,就是怎么来表示或描述硬盘和或硬盘分区,但这种描述应该是科学和具体的;比如IDE硬 盘,在Linux 可以表示为 /dev/hda、/dev/hdb … ;SCSI 接口的硬盘、SATA接口的硬盘表示为/dev/sda、/dev/sdb … … ;而IDE接口的硬盘/dev/hda,也可以表示为hd0 ,而 SCSI 接口的如果是 /dev/sda ,另一种表示方法是sd0; 理解两种表示方法有何用?至少GRUB引导管理器用到这些知识;另外我们mount (挂载)文件系统 (分区) ,也会用到这些知识; 目录索引 一、对于IDE接口的硬盘的两种表示方法;1、IDE接口硬盘,对于整块硬盘的两种表示方法; 2、IDE接口硬盘分区的两种表示方法;1) 硬盘分区的第一种表示方法/dev/hd[a-z]X; 硬盘分区的第二种表示方法(hd[0-n],y);二、关于SATA和SCSI接口的硬盘的两种表示方法; 三、usb及1394接口的存储设备和软驱设备; 四、关于存储设备的不同的表示方法的应用;1、/dev/hd[a-z] 表示方法的应用;1) 用于mount 挂载文件系统 (分区) 之用; 用于GRUB中指定Linux的根分区的位置;2、hd[0-n] 表示方法的应用;五、关于本文; 六、参考文档; 六、相关文档; 一、对于IDE接口的硬盘的两种表示方法; 1、IDE接口硬盘,对于整块硬盘的两种表示方法; IDE接口中的整块硬盘在Linux系统中表示为/dev/hd[a-z],比如/dev/hda,/dev/hdb … … 以此类推,有时/dev/hdc可能表示的是CDROM ,还是以具体的fdisk -l 输出为准吧; 另一种表示方法是hd[0-n] ,其中n是一个正整数,比如hd0,hd1,hd2 … … hdn ; 如果机器中只有一块硬盘,无论我们通过fdisk -l 列出的是/dev/hda 还是/dev/hdb ,都是hd0;如果机器中存在两个或两个以上的硬盘,第一个硬盘/dev/hda 另一种方法表示为hd0,第二个硬盘/dev/hdb,另一种表法是hd1 ; 感觉大家对hd0,hd1这种表示方法并不寞生,现在新的机器,在BIOS 中,在启动盘设置那块,硬盘是有hd0,hd1之类的,这就是硬盘表示方法的一种; 对于/dev/hda 类似的表示方法,也并不寞生吧;我们在Linux通过fdisk -l 就可以查到硬盘是/dev/hda还是/dev/hdb; [root@localhost ~]# fdisk -l Disk /dev/hda: 80.0 GB, 80026361856 bytes ...

2012-01-02 · 4 min · 822 words · -

Grub磁盘分区表示方法

Grub磁盘分区表示方法 Grub指定分区的方法和Linux、Windows等系统不一样,它的主要特点为: Grub在表示方式上并不区分普通的IDE硬盘、当下流行的SATA硬盘和SCSI硬盘等,在Grub中,硬盘会被识别为hd#,#是从0开始的硬盘编号,而软盘被类似地识别为fd#。 Grub的硬盘编号和分区编号都是从0开始的,这一点linux不同。 按照以上两个特点,假设有一块硬盘(hd0),那么(hd0,0) (hd0,1) (hd0,2) (hd0,3)依次表示它的四个主分区,而随后的(hd0,4)...则是逻辑分区。 通常情况下,装有Windows的硬盘中,通常是按照一个主分区(hd0,0),一个扩展分区(hd0,1)该扩展分区下是若干逻辑分区。这样(hd0,0)对应C盘,(hd0,4)对应D盘,依此类推。 如果您还不能确定你需要的那个分区,可以在输入过程中按下Tab键实现命令补全。比如你在输入一条root语句: root (hd0, 此时按下Tab键,grub将列出可用的分区编号和分区类型 (grub还不能识别ntfs分区,显示为不知道类型的分区) 。你可以依照这个提示来完成命令的输入。 如果不能确定ISO文件的位置,可使用find 文件名.iso(find debian-40r2-i386-CD-1.iso)

2012-01-02 · 1 min · 18 words · -

linux iwconfig

linux iwconfig apt-get install wireless-tools iwconfig wlan0 essid your essid iwconfig wlan0 key s:yourpass iwconfig wlan0 mode managed dhclient wlan0 iwconfig 是linux wireless extensions(lwe)的用户层配置工具之一。 lwe是linux下对无线网络配置的工具,包括内核的支持、用户层配置工具和驱动接口的支持三部 分。目前很多无线网卡都支持lwe,而且主流的linux发布版本,比如redhat linux、ubuntu linux都已经带了这个配置工具。 iwconfig 用法: iwconfig interface [essid {nn|on|off}] [nwid {nn|on|off}] [mode {managed|ad-hoc|…} [freq n.nnnn[k|m|g]] [channel n] [ap {n|off|auto}] [sens n] [nick n] [rate {n|auto|fixed}] [rts {n|auto|fixed|off}] [frag {n|auto|fixed|off}] [enc {nnnn-nnnn|off}] [power {period n|timeout n}] [retry {limit n|lifetime n}] [txpower n {mw|dbm}] [commit] 说明: iwconfig是lwe最主要的工具,可以对无线网卡的大部分参数进行配置。 参数: essid: 设置无线网卡的essid(extension service set id)。 ...

2012-01-01 · 1 min · 155 words · -

debian network command

debian network command restart sudo /etc/init.d/networking restart ****#获取地址 sudo dhclient eth0 wlan iwlist wlan0 scan iwconfig wlan0 essid iwconfig wlan0 key open iwconfig

2012-01-01 · 1 min · 23 words · -

Linux系统日志–syslog

Linux系统日志–syslog 我们可以借助syslog函数将消息写入到/var/log/messages文件或其他配置好的文章。syslogd (系统日志守护进程) 会监控程序提交的消息并对其进行处理。klogd (内核日志守护进程) 负责监控内核提交的消息,并将内核消息记录到/var/log/messages。二者协作记录日志消息。每次启动linux时,这两个守护进程都会由/etc/rc.d/init.d中的初始化脚本启动。 #vi /etc/syslog.conf daemon.info /var/log/messages syslog.conf文件中每一行包括以下内容: l 选择器, 用于表明应该记录哪些消息的一组单词。包括设备 (用于指定选择哪种类型程序的代码,即生成该消息的程序类别) 和优先级 (又能够于指定选择记录的消息类型,更确切的说是表明该消息所代表事件的严重程度) 。 l 动作,用于指定sysogd接收到与选择标准相匹配的消息时应该执行的动作,通常可以使消息要写入的文件名,或应该显示该消息的机器的用户名。 设备 设备描述 设备名 来自login等用户身份验证类程序的消息 auth 特殊目的 (私有) 用户身份验证消息 auth-priv 来自cron程序的消息 (用于控制自动化得,调度后的任务) cron 来自未在此处列出的所有标准守护进程或服务器的消息 deamon 内核消息 (由klogd捕捉) kern 打印服务器消息 lpr 邮件服务器消息 (来自mail transfer agent) mail 新闻服务器消息 news 关于系统登录进程本身的消息 syslog 来自终端用户所启动程序的消息 user 来自uucp程序的消息 uucp 八个特定用途的类别信息,linux销售商和编程人员可能需要使用这些消息来定义通常类别信息之外的特定需求 local0到local7 优先级 优先级描述 优先级名 无优先级 none 调试信息 debug 关于程序当前状态的报告消息 info 程序运行中产生了值得注意的事件 notice 程序中存在潜在问题的警告信息 waring 程序存在错误的通告 err 错误消息,可能会导致程序关闭的事件 crit 严重错误消息,会导致程序关闭并可能影响其他程序 alert 发生严重事件,并有导致系统崩溃的潜在危险 emerg 简单动作大概如下: ...

2011-12-30 · 1 min · 102 words · -

Java按位异或运算符

Java按位异或运算符 按位异或运算符 两个操作数中,如果两个相应位相同,则结果为0,否则为1 即: 0^0=0, 1^0=1, 0^1=1, 1^1=0 例如: 00101010^00010111=00111101 1)如果需使用一个整数的某些特定的位翻转,可使用另一个 相应位为1的操作数与原来的整数进行按位异或操作实现。 下面的例子对整数变量 ii的第四位翻转 int revertFouth=ii^8; 其余位则没有变化 通过按位异或运算可以实现两个值的交换。而不使用临 时变量。例如交换两个整数a,b的值可通过下列语句实现: int a=15,b=24; //a的最右边8位为00001111,b的最右边8位为00011000 //a和b其余位为0,下同 a=a^b; //a的最右边8位为00010111,a=23 b=b^a; //b的最右边8位为00001111,b=15 a=a^b; //a的最右边8位为00011000,a=24 *位逻辑运算表达式返回两个操作数中数据长度较长的数据 类型 其中较小的左侧将被填满,若为整数,则填满0, 若为负数,则左侧填满1 首先复习一下异或运算 (^) 的性质: 它满足交换律、结合律。 此处有一个经典的运用: 现在有一万 (1-10000) 的个数,从中拿掉一个数,问怎么才能找出拿掉的数? 设 最初的数组是 A, 拿掉 x 之后的数组是 B, xor() 是对数组内所有元素做异或,则有: xor(A) == xor(B) ^ x Fake代码 xor(A) == xor(B) ^ x 所以: xor(B) ^ xor(A) == xor(B) ^ xor(B) ^ x == 0 ^ x == x ...

2011-12-28 · 1 min · 123 words · -

JDO

JDO JDO(Java Data Object )是Java对象持久化的新的规范,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码 (如JDBC API的使用) 。这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC只是面向关系数据库 (RDBMS) JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库 (ODBMS) 等等,使得应用可移植性更强。 应用程序的开发人员通过访问JDO Instance , 达到访问JDO Instance 所代表的数据对象,包括:ERP,数据库系统等.使数据的存储介质对于应用的开发人员完全透明. JDO最早是由Sun召集众多的O/R Mapping开发团队集中起来共同提出的,首先是通过会议确定了JDO需要包括的内容,然后正式提出一个Java规范请求 (JSR-12) ,正式开始了JDO规范的制定。下面是主要的进展里程碑。 JSR #000012 approved in July 1999 1999-8组建的专家小组: 包括Sun、Apple、BEA、IBM、Oracle、SAP、WebGain等 2000-5 完成公开评论草案 2000-6 在JavaOne上引入 2001-3 最终草案0.93 2001-5 最终草案0.96公布 2001-6 在JavaOne上启动 2001-11 最终草案0.98 2002-4 1.0版正式公布 2002-8 1.0.1修正版 2003-8 2.0规范启动

2011-12-27 · 1 min · 48 words · -

设置 Emacs 的编码格式

设置 Emacs 的编码格式 查看一下 Emacs 读取文件用的编码格式。 M-x describe-coding-system 把 Emacs 的默认编码设置为 UTF-8。 在 .emacs 文件里放入下面这段代码: [lisp] ;;set the default text coding system (setq default-buffer-file-coding-system ‘utf-8) [/lisp] 可是即使我加了上面这条语句,为什么 Emacs 依然显示 org 文件为乱码呢? 原来上面这一行,只是适用于写文件的情况。当你读取一个文件的时候,可能依然会显示出乱码,因为 Emacs 读文件也是按照一定的编码规律来解读文件的。我们再用命令 M-x describe-coding-system 仔细观察一下结果里面的内容,是不是有类似下面这样一段: Priority order for recognizing coding systems when reading files: 1. iso-latin-1 (alias: iso-8859-1 latin-1) 2. utf-8 (alias: mule-utf-8) 3. iso-2022-7bit 4. iso-2022-7bit-lock (alias: iso-2022-int-1) 5. iso-2022-8bit-ss2 6. emacs-mule 7. raw-text 8. iso-2022-jp (alias: junet) 9. in-is13194-devanagari (alias: devanagari) 10. chinese-iso-8bit (alias: cn-gb-2312 euc-china euc-cn cn-gb gb2312) 11. utf-8-auto 12. utf-8-with-signature 13. utf-16 14. utf-16be-with-signature (alias: utf-16-be) 15. utf-16le-with-signature (alias: utf-16-le) 16. utf-16be 17. utf-16le 18. japanese-shift-jis (alias: shift_jis sjis cp932) 19. undecided 这就是 Emacs 在读文件时候的解码顺序!如果你的文件是以英文开头,自然会套用第一种方法。这个时候,我们还需要调整一下这个编码的先后次序。用命令 M-x prefer-coding-system 就可以调整这些顺序。调整完顺序,再打开 org 文件看一看,终于恢复原貌了。 如果你只是用命令 M-x prefer-coding-system 来设置,下次重启 Emacs 的时候,这个设置就会自动清除。如果需要每次都采用这个设置,可以把下面这行扔到 .emacs 里指定优先用 utf-8 来解码: (prefer-coding-system ‘utf-8) ...

2011-12-27 · 1 min · 145 words · -

java generic, 泛型

java generic, 泛型 泛型, generic 泛型是jdk5引入的类型机制,本质是将类型参数化(是早在1999年就制定的jsr14的实现) 也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。 泛型解决了几个问题: 1 可读性,从字面上就可以判断集合中的内容类型; 2 类型检查,避免插入非法类型。 3 获取数据时不在需要强制类型转换。 在Java SE 1.5之前,没有泛型的情况的下,通过对类型(Object)的引用来实现参数的"任意化",“任意化"带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。 泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。 规则和限制 泛型的类型参数只能是类类型 (包括自定义类) ,不能是简单类型。 同一种泛型可以对应多个版本 (因为参数类型是不确定的) ,不同版本的泛型类实例是不兼容的。 泛型的类型参数可以有多个。 泛型的参数类型可以使用extends语句,例如。习惯上称为"有界类型”。 泛型的参数类型还可以是通配符类型。例如Class classType = Class.forName(“java.lang.String”); 泛型还有接口、方法等等,内容很多,需要花费一番功夫才能理解掌握并熟练应用。在此给出我曾经了解泛型时候写出的两个例子 (根据看的印象写的) ,实现同样的功能,一个使用了泛型,一个没有使用,通过对比,可以很快学会泛型的应用,学会这个基本上学会了泛型70%的内容。 例子一: 使用了泛型 package com.wiloon.test.generics; class Gen<T> { private T ob; // 定义泛型成员变量 public Gen(T ob) { this.ob = ob; } public T getOb() { return ob; } public void setOb(T ob) { this.ob = ob; } public void showType() { System.out.println("T的实际类型是: " + ob.getClass().getName()); } } public class GenDemo { public static void main(String[] args) { // 定义泛型类Gen的一个Integer版本 Gen<Integer> intOb = new Gen<Integer>(88); intOb.showType(); int i = intOb.getOb(); System.out.println("value= " + i); System.out.println("------------"); // 定义泛型类Gen的一个String版本 Gen<String> strOb = new Gen<String>("Hello Gen!"); strOb.showType(); String s = strOb.getOb(); System.out.println("value= " + s); } } 例子二: 没有使用泛型 ...

2011-12-26 · 11 min · 2182 words · -

remember me

remember me jwt http://blog.daocloud.io/5700.html spring security http://www.semlinker.com/spring-security-remember-me/ https://www.cnblogs.com/zongmin/p/13783285.html restful api remember me https://blog.csdn.net/liukangjie520/article/details/111617244 https://xie.infoq.cn/article/f83774aa8603152a82105ab69

2011-12-26 · 1 min · 14 words · -

Annotation/注解

Annotation/注解 annotation http://www.cnblogs.com/mandroid/archive/2011/07/18/2109829.html annotation 是Java5开始引入的新特征。中文名称一般叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。 更通俗的意思是为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或框架使用的。 annotation 像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的声明语句中。 Annotation其实是一种接口。通过Java的反射机制相关的API来访问annotation信息。相关类(框架或工具中的类)根据这些信息来决定如何使用该程序元素或改变它们的行为。 annotation是不会影响程序代码的执行,无论annotation怎么变化,代码都始终如一地执行。 Java语言解释器在工作时会忽略这些annotation,因此在JVM 中这些annotation是"不起作用"的,只能通过配套的工具才能对这些 annotation 类型的信息进行访问和处理。 Annotation 与interface的异同 Annotation类型使用关键字@interface而不是interface。 这个关键字声明隐含了一个信息: 它是继承了java.lang.annotation.Annotation接口,并非声明了一个interface。 Annotation类型、方法定义是独特的、受限制的。 Annotation 类型的方法必须声明为无参数、无异常抛出的。这些方法定义了annotation的成员: 方法名成为了成员名,而方法返回值成为了成员的类型。方法返回值类型必须为primitive类型、Class类型、枚举类型、annotation类型或者由前面类型之一作为元素的一维数组。方法的后面可以使用 default 和一个默认数值来声明成员的默认值,null 不能作为成员默认值,这与我们在非 annotation 类型中定义方法有很大不同。 Annotation 类型和它的方法不能使用 annotation 类型的参数、成员不能是 generic。只有返回值类型是Class的方法可以在annotation类型中使用generic,因为此方法能够用类转换将各种类型转换为Class。 Annotation类型又与接口有着近似之处。 它们可以定义常量、静态成员类型(比如枚举类型定义)。Annotation类型也可以如接口一般被实现或者继承。 应用场合 annotation一般作为一种辅助途径,应用在软件框架或工具中,在这些工具类中根据不同的 annotation 注解信息采取不同的处理过程或改变相应程序元素(类、方法及成员变量等)的行为。 例如: Junit、Struts、Spring等流行工具框架中均广泛使用了 annotation 。使代码的灵活性大提高。 常见标准的Annotation 从java5版本开始,自带了三种标准 annotation 类型: Override java.lang.Override 是一个marker annotation类型,它被用作标注方法。它说明了被标注的方法重载了父类的方法,起到了断言的作用。如果我们使用了这种annotation在一个没有覆盖父类方法的方法时,java编译器将以一个编译错误来警示。 这个annotaton常常在我们试图覆盖父类方法而确又写错了方法名时加一个保障性的校验过程。 Deprecated Deprecated也是一种marker annotation。当一个类型或者类型成员使用@Deprecated修饰的话,编译器将不鼓励使用这个被标注的程序元素。所以使用这种修饰具有一定的 “延续性”: 如果我们在代码中通过继承或者覆盖的方式使用了这个过时的类型或者成员,虽然继承或者覆盖后的类型或者成员并不是被声明为 @Deprecated,但编译器仍然要报警。 注意: @Deprecated这个annotation类型和javadoc中的 @deprecated这个tag是有区别的: 前者是java编译器识别的,而后者是被javadoc工具所识别用来生成文档(包含程序成员为什么已经过时、它应当如何被禁止或者替代的描述)。 SuppressWarnings 此注解能告诉Java编译器关闭对类、方法及成员变量的警告。 有时编译时会提出一些警告,对于这些警告有的隐藏着Bug,有的是无法避免的,对于某些不想看到的警告信息,可以通过这个注解来屏蔽。 SuppressWarning不是一个marker annotation。它有一个类型为String[]的成员,这个成员的值为被禁止的警告名。对于javac编译器来讲,被-Xlint选项有效的警告名也同样对@SuppressWarings有效,同时编译器忽略掉无法识别的警告名。 annotation语法允许在annotation名后跟括号,括号中是使用逗号分割的name=value对用于为annotation的成员赋值: 代码: @SuppressWarnings(value={“unchecked”,“fallthrough”}) ...

2011-12-26 · 8 min · 1532 words · -

非容器环境运行OpenJPA应用

非容器环境运行OpenJPA应用 参考来源: http://lxy19791111.iteye.com/blog/184113 2.Animal.java package com.openjpa.entity; import javax.persistence.Basic; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.SequenceGenerator; /** * Animal 用于表征系统中的Animal对象,他有两个属性 * id - 编号,编号将由Oracle数据库自动生成 * name - Animal的名称 */ /* Entity注释表示该类是持久化类,的name属性是该实体在查询中对应的唯一名称,默认是类名 */ @Entity public class Animal { // 名称 @Basic private String name; // 编号 /* Id注释表示该字段是标识字段 */ @Id //for oracle //@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SEQ_ANIMAL") //@SequenceGenerator(name="SEQ_ANIMAL", sequenceName="SEQ_ANIMAL") //for MySQL @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } AnimalDAO.java ...

2011-12-25 · 4 min · 717 words · -

Go mem, Go 内存

Go mem, Go 内存 用户程序(Mutator)会通过内存分配器(Allocator)在堆上申请内存,而垃圾收集器(Collector)负责回收堆上的内存空间,内存分配器和垃圾收集器共同管理着程序中的堆内存空间。 https://draveness.me/golang/docs/part3-runtime/ch07-memory/golang-garbage-collector/

2011-12-25 · 1 min · 6 words · -

gopacket, pcap, libpcap

gopacket, pcap, libpcap gopacket 是 google 出品的 抓取网络数据包的库 Windows 平台下有 Wireshark 抓包工具,其底层抓包库是 npcap (以前是 winpcap); Linux 平台下有 Tcpdump,其抓包库是 libpcap; 而 gopacket 库可以说是 libpcap 和 npcap 的 go 封装,提供了更方便的 go 语言操作接口。 # gopacket 依赖 pcap.h, 安装 libpcap-dev sudo apt install libpcap-dev sudo pacman -S libpcap https://zhuanlan.zhihu.com/p/361737169 https://github.com/google/gopacket https://pkg.go.dev/github.com/google/gopacket?utm_source=godoc bpf filter dst host 192.168.50.10

2011-12-25 · 1 min · 52 words · -

JNDI

JNDI JNDI (Java Naming and Directory Interface,Java命名和目录接口) 是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性。 英文全称是:Java Naming and Directory InterfaceS 术语解释: 一组帮助做多个命名和目录服务接口的API。 JNDI(Java Naming and Directory Interface)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI SPI的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。集群JNDI实现了高可靠性JNDI[8],通过服务器的集群,保证了JNDI的负载平衡和错误恢复。在全局共享的方式下,集群中的一个应用服务器保证本地JNDI树的独立性,并拥有全局的JNDI树。每个应用服务器在把部署的服务对象绑定到自己本地的JNDI树的同时,还绑定到一个共享的全局JNDI树,实现全局JNDI和自身JNDI的联系。 JNDI(Java Naming and Directory Interface)是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,类似JDBC都是构建在抽象层上。 JNDI可访问的现有的目录及服务有: DNS、XNam 、Novell目录服务、LDAP(Lightweight Directory Access Protocol 轻型目录访问协议)、 CORBA对象服务、文件系统、Windows XP/2000/NT/Me/9x的注册表、RMI、DSML v1&v2、NIS。 JNDI优点 包含了大量的命名和目录服务,使用通用接口来访问不同种类的服务; 可以同时连接到多个命名或目录服务上; 建立起逻辑关联,允许把名称同Java对象或资源关联起来,而不必知道对象或资源的物理ID。 JNDI程序包: javax.naming: 命名操作; javax.naming.directory: 目录操作; javax.naming.event: 在命名目录服务器中请求事件通知; javax.naming.ldap: 提供LDAP支持; javax.naming.spi: 允许动态插入不同实现。 利用JNDI的命名与服务功能来满足企业级API对命名与服务的访问,诸如EJB、JMS、JDBC 2.0以及IIOP上的RMI通过JNDI来使用CORBA的命名服务。 JNDI架构 JNDI架构提供了一组标准的独立于命名系统的API,这些API构建在与命名系统有关的驱动之上。这一层有助于将应用与实际数据源分离,因此不管应用访问的是LDAP、RMI、DNS、还是其他的目录服务。换句话说,JNDI独立于目录服务的具体实现,只要有目录的服务提供接口 (或驱动) ,就可以使用目录。 关于JNDI要注意的重要一点是,它提供了应用编程接口(application programming interface,API)和服务提供者接口(service provider interface,SPI)。这一点的真正含义是,要让应用与命名服务或目录服务交互,必须有这个服务的JNDI服务提供者,这正是JNDI SPI发挥作用的地方。服务提供者基本上是一组类,这些类为各种具体的命名和目录服务实现了JNDI接口—很象JDBC驱动为各种具体的数据库系统实现了JDBC接口一样。作为一个应用开发者,不必操心JNDI SPI。只需要确认要使用的每一个命名或目录服务都有服务提供者。 JNDI组件 1、Javax.naming: 包含了访问命名服务的类和接口。例如,它定义了Context接口,这是命名服务执行查询的入口。 2、Javax.naming.directory: 对命名包的扩充,提供了访问目录服务的类和接口。例如,它为属性增加了新的类,提供了表示目录上下文的DirContext接口,定义了检查和更新目录对象的属性的方法。 3、Javax.naming.event: 提供了对访问命名和目录服务时的时间通知的支持。例如,定义了NamingEvent类,这个类用来表示命名/目录服务产生的事件,定义了侦听NamingEvents的NamingListener接口。 4、Javax.naming.ldap: 这个包提供了对LDAP 版本3扩充的操作和控制的支持,通用包javax.naming.directory没有包含这些操作和控制。 5、Javax.naming.spi: 这个包提供了一个方法,通过javax.naming和有关包动态增加对访问命名和目录服务的支持。这个包是为有兴趣创建服务提供者的开发者提供的。 JNDI用途 命名或目录服务使用户可以集中存储共有信息,这一点在网络应用中是重要的,因为这使得这样的应用更协调、更容易管理。例如,可以将打印机设置存储在目录服务中,以便被与打印机有关的应用使用。 我们大家每天都不知不觉地使用了命名服务。命名系统中的对象可以是DNS记录中的名称、应用服务器中的EJB组件(Enterprise JavaBeans Component)、LDAP(Lightweight Directory Access Protocol)中的用户Profile。 目录服务是命名服务的自然扩展。两者之间的关键差别是目录服务中对象可以有属性 (例如,用户有email地址) ,而命名服务中对象没有属性。因此,在目录服务中,你可以根据属性搜索对象。JNDI允许你访问文件系统中的文件,定位远程RMI注册的对象,访问象LDAP这样的目录服务,定位网络上的EJB组件。 对于象LDAP 客户端、应用launcher、类浏览器、网络管理实用程序,甚至地址薄这样的应用来说,JNDI是一个很好的选择。 JNDI可访问的现有的目录及服务有: DNS、XNam 、Novell目录服务、LDAP(Lightweight Directory Access Protocol 轻型目录访问协议)、 CORBA对象服务、文件系统、Windows XP/2000/NT/Me/9x的注册表、RMI、DSML v1&v2、NIS JNDI与JDBC JNDI提供了一种统一的方式,可以用在网络上查找和访问服务。通过指定一个资源名称,该名称对应于数据库或命名服务中的一个记录,同时返回数据库连接建立所必须的信息。 JNDI主要有两部分组成: 应用程序编程接口和服务供应商接口。应用程序编程接口提供了Java应用程序访问各种命名和目录服务的功能,服务供应商接口提供了任意一种服务的供应商使用的功能。 代码示例: try{ Context cntxt = new InitialContext(); DataSource ds = (DataSource) cntxt.lookup("jdbc/dpt"); } catch(NamingException ne){ ... } JNDI与JMS 消息通信是软件组件或应用程序用来通信的一种方法。JMS就是一种允许应用程序创建、发送、接收、和读取消息的JAVA技术。 代码示例: try{ Properties env = new Properties(); InitialContext inictxt = new InitialContext(env); TopicConnectionFactory connFactory = (TopicConnectionFactory) inictxt.lookup("TTopicConnectionFactory"); ... } catch(NamingException ne){ ... } 访问特定目录: 举个例子,人是个对象,他有好几个属性,诸如这个人的姓名、电话号码、电子邮件地址、邮政编码等属性。通过getAttributes()方法 Attribute attr = directory.getAttributes(personName).get("email"); String email = (String)attr.get(); 通过使用JNDI让客户使用对象的名称或属性来查找对象: foxes = directory.search("o=Wiz,c=US", "sn=Fox", controls); 通过使用JNDI来查找诸如打印机、数据库这样的对象,查找打印机的例子: Printer printer = (Printer)namespace.lookup(printerName); printer.print(document); 浏览命名空间: NamingEnumeration list = namespace.list("o=Widget, c=US"); while (list.hasMore()) { NameClassPair entry = (NameClassPair)list.next(); display(entry.getName(), entry.getClassName()); } 常用的JNDI操作 void bind(String sName,Object object);――绑定: 把名称同对象关联的过程 void rebind(String sName,Object object);――重新绑定: 用来把对象同一个已经存在的名称重新绑定 void unbind(String sName);――释放: 用来把对象从目录中释放出来 Object lookup(String sName);――查找: 返回目录中的一个对象 void rename(String sOldName,String sNewName);――重命名: 用来修改对象名称绑定的名称 NamingEnumeration listBinding(String sName);――清单: 返回绑定在特定上下文中对象的清单列表 NamingEnumeration list(String sName); 代码示例: 重新得到了名称、类名和绑定对象。 NamingEnumeration namEnumList = ctxt.listBinding("cntxtName"); ... while ( namEnumList.hasMore() ) { Binding bnd = (Binding) namEnumList.next(); String sObjName = bnd.getName(); String sClassName = bnd.getClassName(); SomeObject objLocal = (SomeObject) bnd.getObject(); } JNDI 是什么 http://blog.csdn.net/zhaosg198312/article/details/3979435 ...

2011-12-25 · 3 min · 451 words · -