Tomcat中的Realm

Realm其实就是一个存放用户名,密码及角色的一个“数据库”。
Tomcat中的Realm有下面几种,你也可以使用自己的Realm,只要实现org.apache.catalina.Realm就可以了。

1.JDBCRealm
授权信息存在关系数据库中, 通过JDBC驱动访问
数据库中必须至少有两张表,表示用户及角色
用户表必须至少有两个字段,用户名及密码
角色表必须至少有两个字段,用户名及角色

create table users (
  user_name         varchar(15) not null primary key,
  user_pass         varchar(15) not null
);

create table user_roles (
  user_name         varchar(15) not null,
  role_name         varchar(15) not null,
  primary key (user_name, role_name)
);
<Realm className="org.apache.catalina.realm.JDBCRealm"
  driverName="org.gjt.mm.mysql.Driver"
  connectionURL="jdbc:mysql://localhost/authority?user=dbuser&amp;password=dbpass"
  userTable="users" userNameCol="user_name" userCredCol="user_pass"
  userRoleTable="user_roles" roleNameCol="role_name"/>

2.DataSourceRealm
授权信息存在关系数据库中, 通过JNDI JDBC数据源访问
数据库中必须至少有两张表,表示用户及角色
用户表必须至少有两个字段,用户名及密码
角色表必须至少有两个字段,用户名及角色

create table users (
  user_name         varchar(15) not null primary key,
  user_pass         varchar(15) not null
);

create table user_roles (
  user_name         varchar(15) not null,
  role_name         varchar(15) not null,
  primary key (user_name, role_name)
);
<Realm className="org.apache.catalina.realm.DataSourceRealm"
  dataSourceName="jdbc/authority"
  userTable="users" userNameCol="user_name" userCredCol="user_pass"
  userRoleTable="user_roles" roleNameCol="role_name"/>

3.JNDIRealm
授权信息存在LDAP目录服务器中,通过JNDI提供者访问

<Realm className="org.apache.catalina.realm.JNDIRealm"
  connectionName="cn=Manager,dc=mycompany,dc=com"
  connectionPassword="secret"
  connectionURL="ldap://localhost:389"
  userPassword="userPassword"
  userPattern="uid={0},ou=people,dc=mycompany,dc=com"
  roleBase="ou=groups,dc=mycompany,dc=com"
  roleName="cn"
  roleSearch="(uniqueMember={0})"
/>

4.UserDatabaseRealm
默认配置,只是用于少量用户
授权信息存在用户数据JNDI资源中,该资源通常是一个XML文档 (conf/tomcat-users.xml)

<tomcat-users>
  <user name="tomcat" password="tomcat" roles="tomcat" />
  <user name="role1"  password="tomcat" roles="role1"  />
  <user name="both"   password="tomcat" roles="tomcat,role1" />
</tomcat-users>

5.MemoryRealm
授权信息存在内存中的对象集合中,该对象集合来自XML文档 (conf/tomcat-users.xml).
仅用于测试。

6.JAASRealm
通过JAAS框架访问授权信息,最灵活最开放的一种授权方式。
如果前面几种方式满足不了你的需求,可以先试试这种方式。

<Realm className="org.apache.catalina.realm.JAASRealm"
  appName="MyFooRealm"
  userClassNames="org.foobar.realm.FooUser"
  roleClassNames="org.foobar.realm.FooRole"/>

7.CombinedRealm
采用多种方式授权。

<Realm className="org.apache.catalina.realm.CombinedRealm" >
  <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
    resourceName="UserDatabase"/>
  <Realm className="org.apache.catalina.realm.DataSourceRealm"
    dataSourceName="jdbc/authority"
    userTable="users" userNameCol="user_name" userCredCol="user_pass"
    userRoleTable="user_roles" roleNameCol="role_name"/>
</Realm>

8.LockOutRealm
多次登录失败后,锁定用户

<Realm className="org.apache.catalina.realm.LockOutRealm" >
  <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
    resourceName="UserDatabase"/>
</Realm>

最后,如果你需要加密密码,那么需要只需要在Realm配置中指定所用的摘要算法就可以了

digest="MD5"
digest="SHA"

参考文章

CMD常用命令08特殊符号

1、.
表示当前目录

dir .\

2、..
表示上一级目录

dir ..\

3、””
界定符号,通常用来引用有空格的目录

dir "c:\Documents and settings"

4、::
注释,和REM类似

5、*
通配符号,表示任意个字符

dir c:\windows\*.log

6、?
通配符号,表示任意一个字符

dir c:\?indows

7、^
转义符

echo ^> >d:\1.txt

8、@
只显示命令执行结果

@echo 你好

9、>
重定向符号,覆盖

dir c:\ > d:\test.txt

10、>>
重定向符号,追加

dir c:\ >> d:\test.txt
dir d:\ >> d:\test.txt

11、|
管道符

netstat -an | find "135"

12、,
某些时候可以当空格来使用

echo,
dir,c:\

13、;
当命令相同时,可以将不同目标用来隔离

dir c:\;d:\

14、&
两个命令连续执行

dir c:\ & dir d:\ & dir e:\

15、&&
当&&前的命令执行成功时,执行&&后的命令

dir c:\ && dir d:\
dir z:\ && dir d:\

16、||
当||前的命令执行失败后,才执行||符号后的内容

dir z:\ || dir c:\
dir c:\ || dir d:\

17、%
%%用于引用变量

set hello=hi
echo %hello%

18、:
标签

@echo off
:again
echo It's me again :)
pause
goto again

CMD常用命令07Bat截取字符串

%var:~n,k%
把这条命令理解为两条子命令
n为开始截取字符的位置,从左向右位置为(0,1,2,3 ...),从右向左位置为(-1,-2,-3,-4)
k为对n右侧字符截取到的位置,k>0从n向右截取的位置,k<0从字符串尾向前截取的位置
n默认从字符串最左边开始,k默认为截断到字符串尾
@echo off
rem echo %var:~n,k%
set str=0123456789

echo 字符串为:%str%
echo 第一个字符为:%str:~0,1%
echo 第二个字符为:%str:~1,1%
echo 倒数第一个字符为:%str:~-1,1%
echo 倒数第二个字符为:%str:~-2,1%
echo 截取前三个字符:%str:~0,3%
echo 截取后三个字符:%str:~-3,3%
echo 第三个字符及其之后的字符为:%str:~2%
echo 倒数第三个字符及其之后的字符为:%str:~-3%
echo 截取到倒数第三个字符:%str:~0,-3%
echo 截取倒数第五和第四个字符:%str:~-5,2%

pause

函数调用约定

1.STDCALL
微软制定的c语言调用约定,也就是传说中的WINAPI
参数从右向左进行压栈(微软官方文档说从左向右压栈),返回值存在eax中,
被调用函数清理栈,不允许变长参数列表
函数名前增加_,函数名后增加@和参数个数(32位机器上一定被4整除)
ret指令中,有可选参数指定有多少字节需要弹栈

2.CDECL
c语言的默认调用约定
参数从右向左进行压栈,返回值存在eax中,
调用函数清理栈,可用变长参数列表
函数名前会增加_

3.FASTCALL
非跨编译器的c语言调用约定,
前2-3个4字节内的参数被存放到寄存器(edx,eax,ecx)中,其他参数,或大于4字节的参数,按从右到左的顺序被存放在栈中
多数情况下,调用函数负责清理栈
仅适用于参数少,而且实时性要求很高的情况下
函数名前增加@,函数名后增加@和参数个数

4.THISCALL
cpp的调用约定
参数从右向左进行压栈,返回值存在eax中,this指针存在ecx中
每种编译器对函数名称有不同的修饰方法,但基于重载的需要,一般都会增加参数类型和类名
当使用extern “C”的时候,cpp编译器会使用c语言的修饰方法来修饰函数名,这样就可以方便的供别人调用了。

MinGW中Socket基础

1.客户端简单例子
myc.c

#define MINGW32

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef MINGW32
#include <winsock2.h>
#else
#include <sys/socket.h>
#include <arpa/inet.h>
#endif

#define MAXLINE 1024

int main(int argc,char **argv) 
{
  int  sockfd,n;
  char  receline[MAXLINE+1];
  struct  sockaddr_in serveraddr;

  //输入参数太少,退出
  if(argc != 2) 
  { 
    printf("Usage :%s  IP_address\n", argv[0]);
    exit(0);
  }

  #ifdef MINGW32
  //Winsows下启用socket
  WSADATA wsadata;
  if(WSAStartup(MAKEWORD(1,1),&wsadata)==SOCKET_ERROR)
  {
    printf("WSAStartup() fail\n");
    exit(0);
  }
  #endif
  
  //建立socket
  if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
  {
    printf("socket() fail\n");
    exit(0);
  }

  //设置协议及Port
  memset(&serveraddr,0,sizeof(serveraddr));
  serveraddr.sin_family = AF_INET;
  serveraddr.sin_port=htons(1024);

  //设置IP
  serveraddr.sin_addr.s_addr=inet_addr(argv[1]);

  //连接
  if(connect(sockfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr))==-1)
  {
    printf("connect() fail\n");
    exit(0);
  }

  //读取数据并输入到标准输出
  #ifdef MINGW32
  while((n=recv(sockfd,receline,MAXLINE,0))>0)
  #else
  while((n=read(sockfd,receline,MAXLINE))>0)
  #endif
  { 
    receline[n]=0;
    if(fputs(receline,stdout)==EOF)
    {
      printf("fputs() error\r\n");
    }
  }

  //没有获取数据
  if(n<0) 
  {
    printf("read() fail\n");
  }

  #ifdef MINGW32
  //Winsows下关闭socket
  closesocket(sockfd);
  WSACleanup();
  #endif

  exit(0);
}
&#91;/code&#93;

2.服务端简单例子
mys.c
&#91;code lang="c"&#93;
#define MINGW32

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef MINGW32
#include <winsock2.h>
#else
#include <sys/socket.h>
#include <arpa/inet.h>
#endif

#define LISTENQ 10

int main(int argc,char *argv[])
{
  int  serverfd,connectfd;
  struct  sockaddr_in serveraddr;
  char  buff[1024];
  time_t  tlick;
  int  iRet;

  #ifdef MINGW32
  //Winsows下启用socket
  WSADATA wsadata;
  if(WSAStartup(MAKEWORD(1,1),&wsadata)==SOCKET_ERROR)
  {
    printf("WSAStartup() fail\n");
    exit(0);
  }
  #endif

  //新建socket
  printf("socket()\n");
  serverfd=socket(AF_INET,SOCK_STREAM,0);
  if(serverfd==-1)
  {
    printf("socket() fail\n");
    exit(0);
  }

  //清零
  memset(&serveraddr,0,sizeof(serveraddr));

  //设置协议
  serveraddr.sin_family=AF_INET;
  //设置IP
  serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
  //设置Port
  serveraddr.sin_port=htons(1024);

  //绑定端口,监听1024端口的任何请求
  printf("bind()\n");
  iRet=bind(serverfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
  if(iRet==-1)
  {
    printf("bind() fail\n");
    exit(0);
  }

  //监听端口,最大并发数10
  printf("listen()\n");
  iRet=listen(serverfd,LISTENQ);
  if(iRet==-1)
  {
    printf("listen() fail\n");
    exit(0);
  }

  //接受请求,发送主机时间
  for(;;)
  {
    printf("Waiting for connection...\n");
    //接受请求
    connectfd=accept(serverfd,(struct sockaddr*)NULL,NULL);
    //获取时间    
    tlick=time(NULL);
    //格式化时间    
    snprintf(buff,sizeof(buff),"From mys:\n%s",ctime(&tlick));
    //写入时间
    //关闭请求
    #ifdef MINGW32
    send(connectfd,buff,strlen(buff),0);
    closesocket(connectfd);
    #else
    write(connectfd,buff,strlen(buff));
    close(connectfd);
    #endif
  }

  #ifdef MINGW32
  //Winsows下关闭socket
  closesocket(serverfd);
  WSACleanup();
  #endif

  //退出
  exit(0);
}

3.Makefile

all:mys myc

mys:mys.c
	gcc -g -o mys mys.c -l wsock32

myc:myc.c
	gcc -g -o myc myc.c -l wsock32

clean:
	del *~ *.o *.exe

VC中Socket通信基础

1.客户端程序
SocketClientBlock.c

#pragma comment(lib, "WS2_32")

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>

#define BUF_SIZE (1024)

int main(int argc,char **argv) 
{
  WSADATA wsadata;

  int  sockfd,n;
  char  receline[BUF_SIZE];
  struct  sockaddr_in serveraddr;

  //Winsows下启用socket
  if(WSAStartup(MAKEWORD(1,1),&wsadata)==SOCKET_ERROR)
  {
    printf("WSAStartup() fail\n");
    exit(0);
  }

  //建立socket
  if((sockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
  {
    printf("socket() fail\n");
    exit(0);
  }

  //设置协议,IP及Port
  memset(&serveraddr,0,sizeof(serveraddr));
  serveraddr.sin_family = AF_INET;
  serveraddr.sin_port=htons(1024);
  serveraddr.sin_addr.s_addr=inet_addr("127.0.0.1");
  /*
  //hostname转ip
  hostent *hostEnt = gethostbyname( strRemote );
  if( hostEnt != NULL )
  {
    lIPAddress = ((in_addr*)hostEnt->h_addr)->s_addr;
    serveraddr.sin_addr.s_addr = lIPAddress;
  }
  else
  {
    serveraddr.sin_addr.s_addr = inet_addr( strRemote );
  }
  */

  //连接
  if(connect(sockfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr))==SOCKET_ERROR)
  {
    printf("connect() fail\n");
    exit(0);
  }

  //读取数据并输入到标准输出
  while((n=recv(sockfd,receline,BUF_SIZE,0))!=SOCKET_ERROR)
  { 
    receline[n]=0;
    if(fputs(receline,stdout)==EOF)
    {
      printf("fputs() error\r\n");
    }
  }

  //没有获取数据
  if(n<0) 
  {
    printf("read() fail\n");
  }

  //Winsows下关闭socket
  closesocket(sockfd);
  WSACleanup();

  exit(0);
}
&#91;/code&#93;

2.服务端程序,阻塞
SocketServerBlock.c
&#91;code lang="c"&#93;
#pragma comment(lib, "WS2_32")

#include <winsock.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define MAX_CONNECT_NUM (10)

int main(int argc,char** argv)
{
  WSADATA wsadata;
  struct  sockaddr_in serveraddr;
  int  socketflag,connectflag;

  time_t  time_tick;
  char  buff[1024];
  
  //Winsows下启用网络
  if(WSAStartup(MAKEWORD(1,1),&wsadata)==SOCKET_ERROR)
  {
    printf("WSAStartup() fail,%d\n", WSAGetLastError());
    exit(0);
  }
  
  //新建socket
  if(INVALID_SOCKET==(socketflag=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)))
  {
    printf("socket() fail\n");
    exit(0);
  }

  //清零,设置协议,设置IP,设置Port
  memset(&serveraddr,0,sizeof(serveraddr));
  serveraddr.sin_family=AF_INET;
  serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
  serveraddr.sin_port=htons(1024);

  //绑定端口,监听1024端口的任何请求
  if(SOCKET_ERROR==bind(socketflag,(struct sockaddr*)&serveraddr,sizeof(serveraddr)))
  {
    printf("bind() fail\n");
    exit(0);
  }

  //监听端口,最大并发数MAX_CONNECT_NUM
  if(SOCKET_ERROR==listen(socketflag,MAX_CONNECT_NUM))
  {
    printf("listen() fail\n");
    exit(0);
  }

  //接受请求,发送主机时间
  for(;;)
  {
    struct  sockaddr clientaddr;
    int iLen = sizeof(clientaddr);
    printf("Waiting for connection...\n");

    //接受连接
    connectflag=accept(socketflag,&clientaddr,&iLen);
    if(INVALID_SOCKET==connectflag)
    {
      printf("accept() fail\n");
      exit(0);
    }

    //获取时间,并格式化
    time_tick=time(NULL);
    sprintf(buff,"From mys:\n%s",ctime(&time_tick));
    //写入时间
    if(SOCKET_ERROR==send(connectflag,buff,strlen(buff),0))
    {
      printf("send() fail\n");
      exit(0);
    }

    //关闭连接
    closesocket(connectflag);
  }

  //Winsows下关闭socket及网络
  if(SOCKET_ERROR==closesocket(socketflag))
  {
    printf("closesocket() fail\n");
    exit(0);
  }
  WSACleanup();

  //退出
  exit(0);
}

3.服务端程序,阻塞,有Select
SocketServerBlockSelect.c

#pragma comment(lib, "WS2_32")

#include <winsock.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define MAX_CONNECT_NUM (10)

int main(int argc,char** argv)
{
  WSADATA wsadata;
  struct  sockaddr_in serveraddr;
  int  socketflag,connectflag;

  fd_set  fdR;
  struct  timeval timeout ={1,500};

  time_t  time_tick;
  char  buff[1024];
  
  //Winsows下启用网络
  if(WSAStartup(MAKEWORD(1,1),&wsadata)==SOCKET_ERROR)
  {
    printf("WSAStartup() fail,%d\n", WSAGetLastError());
    exit(0);
  }
  
  //新建socket
  if(INVALID_SOCKET==(socketflag=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)))
  {
    printf("socket() fail\n");
    exit(0);
  }

  //清零,设置协议,设置IP,设置Port
  memset(&serveraddr,0,sizeof(serveraddr));
  serveraddr.sin_family=AF_INET;
  serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
  serveraddr.sin_port=htons(1024);

  //绑定端口,监听1024端口的任何请求
  if(SOCKET_ERROR==bind(socketflag,(struct sockaddr*)&serveraddr,sizeof(serveraddr)))
  {
    printf("bind() fail\n");
    exit(0);
  }

  //监听端口,最大并发数MAX_CONNECT_NUM
  if(SOCKET_ERROR==listen(socketflag,MAX_CONNECT_NUM))
  {
    printf("listen() fail\n");
    exit(0);
  }

  //接受请求,发送主机时间
  for(;;)
  {
    printf("Waiting for connection...\n");

    FD_ZERO(&fdR);
    FD_SET(socketflag, &fdR);
        switch (select(0, &fdR, NULL, NULL,&timeout)) 
    {
    case SOCKET_ERROR:
      printf("Socket Error...\n");
      break;
    case 0:
      printf("Time Out Here...\n");
      break;
    default:
      printf("Connection is coming...\n");
      if (1)
      {
        struct  sockaddr clientaddr;
        int iLen = sizeof(clientaddr);

        //接受连接
        connectflag=accept(socketflag,&clientaddr,&iLen);
        if(INVALID_SOCKET==connectflag)
        {
          printf("accept() fail\n");
          exit(0);
        }

        //获取时间,并格式化
        time_tick=time(NULL);
        sprintf(buff,"From mys:\n%s",ctime(&time_tick));
        //写入时间
        if(SOCKET_ERROR==send(connectflag,buff,strlen(buff),0))
        {
          printf("send() fail\n");
          exit(0);
        }

        //关闭连接
        closesocket(connectflag);
      }
      break;
        }
  }

  //Winsows下关闭socket及网络
  if(SOCKET_ERROR==closesocket(socketflag))
  {
    printf("closesocket() fail\n");
    exit(0);
  }
  WSACleanup();

  //退出
  exit(0);
}

4.服务端程序,非阻塞
SocketServerNonBlock.c

#pragma comment(lib, "WS2_32")

#include <winsock.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define MAX_CONNECT_NUM (10)

int main(int argc,char** argv)
{
  WSADATA wsadata;
  struct  sockaddr_in serveraddr;
  int  socketflag,connectflag;

  time_t  time_tick;
  char  buff[1024];

  unsigned long flag=1;
  
  //Winsows下启用网络
  if(WSAStartup(MAKEWORD(1,1),&wsadata)==SOCKET_ERROR)
  {
    printf("WSAStartup() fail,%d\n", WSAGetLastError());
    exit(0);
  }
  
  //新建socket
  if(INVALID_SOCKET==(socketflag=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)))
  {
    printf("socket() fail\n");
    exit(0);
  }

  //非阻塞方式
  if(ioctlsocket(socketflag,FIONBIO,&flag)!=0)
  {
    printf("ioctlsocket() fail\n");
    exit(0);
  }

  //清零,设置协议,设置IP,设置Port
  memset(&serveraddr,0,sizeof(serveraddr));
  serveraddr.sin_family=AF_INET;
  serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
  serveraddr.sin_port=htons(1024);

  //绑定端口,监听1024端口的任何请求
  if(SOCKET_ERROR==bind(socketflag,(struct sockaddr*)&serveraddr,sizeof(serveraddr)))
  {
    printf("bind() fail\n");
    exit(0);
  }

  //监听端口,最大并发数MAX_CONNECT_NUM
  if(SOCKET_ERROR==listen(socketflag,MAX_CONNECT_NUM))
  {
    printf("listen() fail\n");
    exit(0);
  }

  //接受请求,发送主机时间
  for(;;)
  {
    struct  sockaddr clientaddr;
    int iLen = sizeof(clientaddr);
    printf("Waiting for connection...\n");

    //接受连接
    connectflag=accept(socketflag,&clientaddr,&iLen);
    if(INVALID_SOCKET==connectflag)
    {
      printf("no connection\n");
      Sleep(1500);
    }
    else
    {
      printf("Connection is coming...\n");
      //获取时间,并格式化
      time_tick=time(NULL);
      sprintf(buff,"From mys:\n%s",ctime(&time_tick));
      //写入时间
      if(SOCKET_ERROR==send(connectflag,buff,strlen(buff),0))
      {
        printf("send() fail\n");
        exit(0);
      }

      //关闭连接
      closesocket(connectflag);
    }
  }

  //Winsows下关闭socket及网络
  if(SOCKET_ERROR==closesocket(socketflag))
  {
    printf("closesocket() fail\n");
    exit(0);
  }
  WSACleanup();

  //退出
  exit(0);
}

XCode切换ARC状态

project -> build setting -> Apple LLVM Complier 3.0 – Language -> Objective-C Auto Reference Counting ->
NO 关闭
YES 打开

ARC在编译阶段会产生代码来处理对象引用数,所以启用ARC的话,很多retian和release都不需要了
注意,现在xcode默认启用ARC,关闭的话,要自己补上释放对象的代码哟

在Xcode中部分禁用ARC

大家都清楚ARC(Automatic Reference Counting)是Xcode中很有用的新特色,
ARC会自动检查对象计数,从而在引用数为0时释放对象,让大家的工作轻松了很多
ARC工作在编译阶段,而不是运行阶段

ARC让代码中很多的retain和release变成了不再必要,简化了程序书写
但很多第三方库中,会自行控制对象的释放,经常会有
@property (nonatomic, readwrite, assign) __weak

在ARC工程中引用非ARC的库,会出现下面的编译错误
property attributes ‘assign’ and ‘weak’ are mutually exclusive

这时,只需要修改引用到非ARC库的源码编译参数就可以了
target -> Build Phases -> Compile Sources -> 相应.m文件
增加编译参数 -fno-objc-arc 就好啦

为了简化工作,把interface中使用到第三方库的部分放到.m文件中,或直接用反射,会简化整个过程

另外,如果你发下使用非ARC库时,出现对象不能retain的状况,试试在link时,加上参数

-all_load
-ObjC

c与cpp输出16进制,8进制及ASCII

1.c

#include <stdio.h>
int main(int argc,char **argv)
{
	for(int i=0;i<=127;i++)
	{
		printf("%X-%03o-%c\n",i,i,i);
	}
	return 0;
}

2.cpp

#include <iostream>
#include <iomanip>

using namespace std;

int main(int argc,char **argv)
{
	for(int i=0;i<=127;i++)
	{
		cout<<setw(2)<<setfill('0')<<hex<<i<<"-"<<setw(3)<<setfill('0')<<oct<<i<<"-"<<dec<<(char)i<<endl;
	}

	return 0;
}

obj还是objs?

运行下面代码,得到的结果是什么?
obj还是objs?

public class Test{
       public static void test(Object obj){
              System.out.println("obj");
       }
       public static void test(Object[] objs){
              System.out.println("objs");
       }
       public static void main(String[] args){
              test(null);
       }
}

是objs哦:)