jar依赖环境下,被依赖的库中的枚举类如果调整枚举顺序会对依赖者产生什么影响?

问题:jar依赖环境下,被依赖的库中的枚举类如果调整枚举顺序会对依赖者产生什么影响? 只所以问这个问题,是因为我不确定枚举项会不会编译到依赖者bytecode的常量区里。如果会,则被依赖库的修改影响不到依赖者。 答案是:依赖者将完全参照被依赖者里的定义来行事,不存在常量区的问题。 ============================场景一:先Hello,再World============================= b.jar里面有个枚举EnumInB.java public enum EnumInB { HELLO("Hello"), WORLD("World"); private String displayText; private EnumInB(String displayText){ this.displayText = displayText; } public String getDisplayText() { return displayText; } } a.jar依赖b.jar,且其中有个类依赖了EnumInB 让它打印一下各个枚举项的值 public class PlayEnumInB { public static void main(String[] args) { System.out.println(EnumInB.HELLO.name() + "-" + EnumInB.HELLO.getDisplayText() + "-" + EnumInB.HELLO.ordinal()); //HELLO-Hello-0 System.out.println(EnumInB.WORLD.name() + "-" + EnumInB.WORLD.getDisplayText() …

jar依赖环境下,被依赖的库中的枚举类如果调整枚举顺序会对依赖者产生什么影响? Read More »

MS Project项目跟踪:如果排在后面的任务被先做了怎么办?

分享MS Project项目跟踪的一个技巧: 如果排在后面的任务被先做了,你应该把这个任务挪到前面来,或者把做掉的那部分挪到前面来 问题: 如果排在后面的任务被先做了,你要怎么更改甘特图才能体现它对进度的影响? 举例来说,原计划是 A B C 结果你第一天没有做A,而是做C做了50%,这时甘特图应该怎么填? 不好的方案 直观的方案是给C填50%,其它不变。但实践证明,这样弄的话,A,B的计划开始时间并不会自动后移; 若查看“项目跟踪-差异"视图将新计划与基线比较,你也看不到A,B的拖延情况 有效的方案 我的办法是:“如实反映”。 如果你就是要把C做完,再做A,B,那就把C挪到最前面 C 100% A B 如果你想接下来做A,B,再做剩下的C的50%,那就把C切分掉,把完成的任务放到最前面: C1 50% A B C 这时候你再检查一下“项目跟踪-差异"视图,它会给你一个让你可以接受的答案。 我这个办法未必是最佳实践。欢迎提出更好的方案

[shell] tomcat启动脚本赏析 – 2. catalina.sh

#!/bin/sh JPDA_ADDRESS=5566 JPDA_SUSPEND=n # Only set CATALINA_HOME if not already set #这里利用了 && 的短路功能 #catalina.sh是在bin目录下,cd "$PRGDIR/.."的作用下是跳到bin目录的上级目录,这时再执行pwd即可得tomcat的目录 [ -z "$CATALINA_HOME" ] && CATALINA_HOME=`cd "$PRGDIR/.." >/dev/null; pwd` # Copy CATALINA_BASE from CATALINA_HOME if not already set [ -z "$CATALINA_BASE" ] && CATALINA_BASE="$CATALINA_HOME" if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then #setenv.sh存在并且当前用户有可读权限 . "$CATALINA_BASE/bin/setenv.sh" #执行一下setenv.sh,点号在这里的作用是临时执行一下脚本但不改变脚本文件的执行权限 elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; …

[shell] tomcat启动脚本赏析 – 2. catalina.sh Read More »

[shell] tomcat启动脚本赏析 – 1. startup.sh

让我们一起来欣赏一下tomcat的启动脚本是怎么写的,重点关注一下其中的shell技巧 #!/bin/sh #将用sh shell执行 PRG="$0" #当前命令,即startup.sh while [ -h "$PRG" ] ; do #-h同-L,用于判断文件是否是符号连接;这段代码用于找到连接背后的真实文件;由于连接的target本身可能也是个连接,所以这里用while循环找出终极连接指向的真实文件 ls=`ls -ld "$PRG"` #为了找出本连接的target,需要执行一下ls命令;这里暂时先把ls命令的输出赋给$ls变量 link=`expr "$ls" : ‘.*-> \(.*\)$’` #通过expr的模式匹配功能,找出$ls中的target部分,并赋给$link变量 if expr "$link" : ‘/.*’ > /dev/null; then #判断$link是否以"/"开头,如果是,则它就是一个完整的路径;这里的> /dev/null是为了使expr的输出不打印在屏幕上 PRG="$link" else PRG=`dirname "$PRG"`/"$link" #如果$link没有以"/"开头,那它就是一个相对路径;也就是说target的完整路径 = 符号连接的目录/相对路径 fi done PRGDIR=`dirname "$PRG"` #得出真实命令文件所处的目录 EXECUTABLE=catalina.sh if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then #判断一下catalina.sh是否存在且可执行 …

[shell] tomcat启动脚本赏析 – 1. startup.sh Read More »

学习shell编程 – 9.函数

#函数 myName(){ echo "I’ve forgot your name" } myName #必须先定义函数,它能执行它 ########################### #函数可以接受参数,但参数不必声明 withArg(){ echo "the first arg is $1" } withArg "hello" ##########################3 #函数的返回值 withReturn(){ return 33 } withReturn echo $? #将打印33, "$?"就是上步函数调用得到的返回值

学习shell编程 – 8.shell的退出、进程及子shell

#结束程序,成功退出 exit 0 #失败退出,将约定的某个数字返回给shell exit 100 # 执行“./hello.sh; echo $?”,就可以看到100 #打印本脚本执行时的进程ID echo pid=$$ ######################## #子shell x=100 (#括号里的将在子shell里运行 echo $x #将打印100 y=900 ) echo $y #打印空

学习shell编程 – 7.调试

#调试shell.sh脚本,每执行一步前都打印一下这一步的指令 $/bin/sh -x ./shell.sh #若想只调试脚本里面一部分代码,需要在脚本文件里面插入调试指令   #打开调试   set -x     if [ 1 -eq 1 ] ; then    :    else    echo not true   fi   #关闭调试   set +x #不执行脚本,只进行语法检查 $/bin/sh -nv ./shell.sh

学习shell编程 – 6. 一些有用的命令

#!/bin/sh #eval: 动态执行命令 command=$1 eval $command #把shell脚本的第一个参数作为命令来执行,如"shell.sh ls"将执行"ls" #用":"代表空操作 if [ 1 -eq 1 ] ; then : #啥也不干 else echo not true fi #用type, which打印一个命令的完整路径 type java which java #sleep sleep 1 #睡1秒 echo woken #用expr执行整数运算 x=`expr 8 / 4` #"/"前后必须有空格;后引号则告诉系统: 将expr 执行的结果赋值给x echo "x=$x"