Google+ <== 這是 Bookmarklet 連結
使用方式:
- 將上面這個 Bookmarklet 連結,拉到瀏覽器的網址列,或加入書籤。
- 在 網址列 或 書籤 中點選剛加入的 Google+ Bookmarklet,就能將目前瀏覽的網頁,分享到 Google+ 上,以下是分享頁面抓圖。
- 按下 Share 鈕即可分享。
package com.isong.cmdexe;
/**
* Usage example:<pre>
* java -jar ds.jar -start localhost 2011
* java -jar ds.jar -start localhost 2011 -sm
* java -jar ds.jar -stop
* </pre>
* @author edwardsayer
*/
public class DummyServer {
/**
* @param args
*/
public static void main(String[] argv) {
new CmdExecutor(new DummyServer()).exec(argv);
}
// execute: java -jar ds.jar -start localhost 2011
@CommandArg(value = "-start ip port", desc = "start the server instance.")
public void doStart(String ip, int port){
System.out.println("Starting server at " + ip + ":" + port + "...");
}
// execute: java -jar ds.jar -sm
@CommandArg(value = "-sm", desc = "start session monitor.")
public void startSessionMonitor(){
System.out.println("Starting session service...");
}
// execute: java -jar ds.jar -stop
@CommandArg(value = "-stop", desc = "stop the server instance.")
public void doStop(){
System.out.println("Stoping...");
}
}
Available options: -start ip port start the server instance. -sm start session monitor. -stop stop the server instance.
@Retention(RetentionPolicy.RUNTIME)
public @interface CommandArg {
String value();
String desc() default "";
}
public class CmdExecutor {
private Map cmdMap;
private StringBuffer cmdDocs;
private Object target;
public CmdExecutor(Object target){
this.target = target;
}
public int exec(String[] args){
System.out.println("args = " + Arrays.asList(args));
initCommands();
if (args.length == 0) {
showCommands();
return 0;
}
for (int i = 0; i < args.length; i++) {
if (args[i].startsWith("-")) {
String option = args[i];
Method method = cmdMap.get(option);
if (method == null) {
System.out.println("Unknown options: " + option);
showCommands();
return 1;
}
try {
Class[] types = method.getParameterTypes();
Object[] paras = new Object[types.length];
for (int j = 0; j < types.length; j++) {
if ( ++i >= args.length || args[i].startsWith("-")) {
System.out.println("Invalid option parameter count: " + option);
showCommands();
return 1;
}
if(types[j].isAssignableFrom(String.class))
paras[j] = args[i];
else if(types[j].isAssignableFrom(int.class)
|| types[j].isAssignableFrom(Integer.class))
paras[j] = Integer.valueOf(args[i]);
else
throw new IllegalArgumentException("Invalid command parameter type: " + method.getName());
}
method.invoke(target, paras);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return 0;
}
private void initCommands(){
if (cmdDocs != null)
return;
cmdDocs = new StringBuffer("Available options:\n");
cmdMap = new HashMap();
Method[] methods = target.getClass().getMethods();
for (Method method: methods) {
CommandArg argCmd = method.getAnnotation(CommandArg.class);
if (argCmd != null) {
cmdDocs.append(argCmd.value() + "\n " + argCmd.desc() + "\n");
cmdMap.put(argCmd.value().split(" ")[0], method);
}
}
}
private void showCommands(){
System.out.println(cmdDocs);
}
}