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 · -

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 : in persistence.xml

2011-12-28 · 1 min · 39 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 · -

执行 Shell 脚本, fork, exec, source, shell 执行

执行 Shell 脚本, fork, exec, source, shell 执行 cx ./xxx.sh sh xxx.sh 用户可以用任何编辑程序来编写Shell程序。因为Shell程序是解释执行的,所以不需要编译成目的程序。按照Shell编程的惯例,以bash 为例,程序的第一行一般为"#!/bin/bash",其中 # 表示该行是注释,叹号 ! 告诉Shell运行叹号之后的命令并用文档的其余部分作为输入,也就是运行/bin/bash并让/bin/bash去执行Shell程序的内容。 执行Shell程序的方法有3种。 sh Shell 程序文件名 这种方法的命令格式为: sh <foo.sh> 这实际上是调用一个新的bash命令解释程序,而把Shell程序文件名作为参数传递给它。新启动的Shell将去读指定的文件,可执行文件中列出的命令,当所有的命令都执行完后结束。该方法的优点是可以利用Shell调试功能。 bash < foo.sh 格式为: bash< Shell程序名 这种方式就是利用输入重定向,使Shell命令解释程序的输入取自指定的程序文件。 用 chmod 命令使 Shell 程序成为可执行的,"./Shell文件名" 一个文件能否运行取决于该文档的内容本身可执行且该文件具有执行权。对于Shell程序,当用编辑器生成一个文件时,系统赋予的许可权都是644(rw-r-r-),用"chomd 755 Shell文件名"命令将其改为可执行的,因此,当用户需要运行这个文件时,"./Shell文件名"来执行就是行了。 在这3种运行Shell程序的方法中,最好按下面的方式选择: 当刚创建一个Shell程序,对它的正确性还没有把握时,应当使用第一种方式进行调试。当一个Shell程序已经调试好时,应使用第三种方式把它固定下来,以后只要键入相应的文件名即可,并可被另一个程序所调用。 source (.) 使用 source 命令和点号(.)是等价的, 类似于 C/C++ 中的 #include 预处理指令,都是将指定的脚本内容拷贝至当前的脚本中,由同一个 Shell 进程来执行。 source (source /directory/script.sh) 与fork的区别是不新开一个 sub-shell 来执行被调用的脚本,而是在同一个 shell 中执行。所以被调用的脚本中声明的变量和环境变量。 都可以在主脚本中得到和使用。 使用 source 执行命令时, 脚本文件可以没有执行权限, source 命令是 bash 的内置命令,不需要 (也没有) 绝对路径. source 命令也称为"点命令",也就是一个点符号 “. “。 source 命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。 ...

2011-12-26 · 2 min · 241 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) ...

2011-12-26 · 2 min · 359 words · -

MySQL修改密码

MySQL修改密码 /usr/bin/MySQLadmin -u root password 'haCahpro' MySQL改root密码 MySQL -u root -p MySQL> SET PASSWORD FOR 'root'@'localhost'=PASSWORD('pa55word'); MySQL> QUIT SQL Error (1130): Host '192.168.1.126' is not allowed to connect to this MySQL server 通过HeidiSQL连接MySQL数据库报错: SQL Error (1130): Host ‘192.168.1.126’ is not allowed to connect to this MySQL server 说明所连接的用户帐号没有远程连接的权限,只能在本机(localhost)登录。 需更改 MySQL 数据库里的 user表里的 host项把localhost改称% 首先按下面的步骤登录MySQL服务器 登录MySQL需要切换到dos下的MySQL的bin目录,进行如下操作: MySQL>use MySQL; MySQL>update user set host = '%' where user ='root'; MariaDB [MySQL]> update user set host = ‘%’ where host = ’localhost’; Query OK, 0 rows affected (0.00 sec) Rows matched: 0 Changed: 0 Warnings: 0 ...

2011-12-26 · 1 min · 102 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 · -

MySQL 数据类型

MySQL 数据类型 datetime, timestamp 两者都是时间类型字段,格式都一致。两者主要有以下几点区别: 最主要的区别-受时区影响不同。timestamp会跟随设置的时区变化而变化,而datetime保存的是绝对值不会变化。 详细可以阅读这篇博客的演示: MySQL: Datetime Versus Timestamp Data Types 一个timestamp字段,一个datetime字段,修改时区SET TIME_ZONE = “america/new_york”;后,timestamp字段的值变了! 因此,如果应用场景有跨时区要求的要特别注意这点。 占用存储空间不同。timestamp储存占用4个字节,datetime储存占用8个字节: 12.8 Data Type Storage Requirements 可表示的时间范围不同。timestamp可表示范围:1970-01-01 00:00:00~2038-01-09 03:14:07,datetime支持的范围更宽1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 索引速度不同。timestamp更轻量,索引相对datetime更快。 数值类型 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定数值字段中的值是否有正负之分或者用零填补。 各种数值类型以及它们的允许范围和占用的内存空间。 TINYINT 大小: 1 字节 范围 (有符号) : -128 ~ 127 范围 (无符号) : 0 ~ 255 用途: 小整数值 SMALLINT 大小: 2 字节 范围 (有符号) : -32,768 ~ 32,767 范围 (无符号) : 0 ~ 65,535 用途: 大整数值 MEDIUMINT 大小: 3 字节 范围 (有符号) : -8,388,608,8,388,607 范围 (无符号) : 0,16,777,215 用途: 大整数值 INT 或 INTEGER 大小: 4 字节 范围 (有符号) : -2 147 483 648,2 147 483 647 范围 (无符号) : 0,4 294 967 295 用途: 大整数值 类型 - 大小 范围 (有符号) 范围 (无符号) 用途 BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) FLOAT 4 字节 (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度浮点数值 DOUBLE 8 字节 (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度浮点数值 DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值小数值 ...

2011-12-26 · 4 min · 726 words · -