Re: Class.getMethod in class's static initializer block
chucky wrote:
Method m = map.get(str);
if(m != null)
m.invoke();
else{ /* default code */ }
You seem to have got the info you needed already. I just wanted to add
that I had some similar code for a "command line server" project. You
might find some good ideas in the code below, or I might get criticized
for language abuse. Either way it'll be educational for someone. ^_^
/*
* ServerTest.java
*
* Created on July 13, 2007, 4:28 PM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package servertest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author B
*/
/**
* Copyright 2007 All rights reserved.
*/
public class ServerTest implements Runnable
{
static private final boolean DEBUG = true;
public static void main(String[] args)
{
// TODO code application logic here
new Thread( new ServerTest() ).start();
}
// DEFAULT CONSTRUCTOR
/** Creates a new instance of ServerTest */
public ServerTest()
{
if( logger == null )
{
logger = Logger.getLogger( ServerTest.class.getName() );
if( DEBUG )
{
ConsoleHandler ch = new ConsoleHandler();
ch.setLevel( Level.ALL );
logger.addHandler( ch );
logger.setLevel( Level.ALL );
logger.setUseParentHandlers( false );
}
}
// port = 25; // 25 is telnet port #
port = 4040;
runServer = true;
commandList = new HashMap<String, CommandLine>();
addCommand( new QuitLineCommand() );
addCommand( new HelloLineCommand() );
addCommand( new ErrorLineCommand() );
addCommand( new TestLineCommand( "test", new CommandRunner()
{ public ReturnCode runCommand( String s )
{ return (ReturnCode) new TestReturnCode( 0, false, "Test
succeded." ); }} ));
}
public void addCommand( CommandLine cl )
{
commandList.put( cl.getCommand(), cl );
}
public void run()
{
while( runServer )
{
try
{
ServerSocket sock = new ServerSocket( port );
logger.info( "Accepting connections on port " + port );
// System.err.println( "Accepting connections on port " +
port );
Socket client = sock.accept();
InputStream clientInput = client.getInputStream();
OutputStream clientOutput = client.getOutputStream();
PrintWriter clientPW = new PrintWriter( clientOutput,
true );
BufferedReader clientBR = new BufferedReader( new
InputStreamReader( clientInput ) );
while( true )
{
String line = clientBR.readLine();
// System.err.println( line );
logger.finer( line );
if( line.length() == 0 )
{
continue;
}
String commands [] = line.split( ":", 2 );
// System.err.print( commands.length + " commands " );
logger.log( Level.FINEST, "Split commands are ",
commands );
// for( int i = 0; i < commands.length; i++ )
// {
// System.err.print( commands[i] + ", " );
// }
// System.err.println();
CommandLine exeObj = null;
if( commands.length >= 1 )
{
exeObj = commandList.get( commands[0] );
}
if( exeObj != null )
{
// System.err.println( exeObj );
String arguments = null;
if( commands.length > 1 )
{
arguments = commands[1];
}
ReturnCode rc = exeObj.runCommand( commands[0],
arguments );
if( rc == null )
{
// System.err.println( "return object was
null!" );
logger.warning( "Return object was null!" );
continue;
}
if( rc.isError() )
{
clientPW.print( '\07' ); // ASCII bell
}
if( rc.getCode() != 0 )
{
clientPW.print( "(" + rc.getCode() +")" );
}
if( rc.getMessage() != null )
{
clientPW.print( rc.getMessage() );
}
clientPW.println();
if( rc.getCode() == -1 )
{
runServer = false;
break;
}
}
else
{
clientPW.println( "\07Command not found." );
// \07 is ASCII bell
// clientPW.flush();
}
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
}
private int port;
private boolean runServer;
private Map<String, CommandLine> commandList;
private static Logger logger;
}
class LineParser
{
public boolean addCommand( CommandLine c )
{
//...
return true;
}
public ReturnCode parseLine( String line )
{
ReturnCode rc = null;
//...
return rc;
}
}
interface CommandLine
{
// public CommandLine( String command );
public String getCommand();
public ReturnCode runCommand( String command, String args );
}
interface CommandRunner
{
public ReturnCode runCommand( String args );
}
class TestLineCommand implements CommandLine
{
public TestLineCommand( String command, CommandRunner exec )
{
this.command = command;
this.exec = exec;
}
public String getCommand()
{
return command;
}
public ReturnCode runCommand(String command, String args)
{
return exec.runCommand( args );
}
private String command;
private CommandRunner exec;
}
class QuitLineCommand implements CommandLine
{
public String getCommand()
{
return "quit";
}
public ReturnCode runCommand(String command, String args)
{
return (ReturnCode) new TestReturnCode( -1, false, "Good-bye" );
}
}
class ErrorLineCommand implements CommandLine
{
public String getCommand()
{
return "error";
}
public ReturnCode runCommand(String command, String args)
{
return (ReturnCode) new TestReturnCode( 1, true, args );
}
}
class HelloLineCommand implements CommandLine
{
public String getCommand()
{
return "hello";
}
public ReturnCode runCommand( String command, String args )
{
return (ReturnCode) new TestReturnCode( 0, false, "Hello World!
You typed: " + args );
}
}
interface ReturnCode
{
public int getCode();
public boolean isError();
public String getMessage();
// public String getExtendedMesage();
}
class TestReturnCode implements ReturnCode
{
public TestReturnCode( int code, boolean isError, String message )
{
this.code = code;
this.error = isError;
this.message = message;
}
public int getCode()
{
return code;
}
public boolean isError()
{
return error;
}
public String getMessage()
{
return message;
}
private int code;
private boolean error;
private String message;
}