'java'에 해당되는 글 15

  1. 2011.11.27 Comparable#compareTo()
  2. 2011.01.27 시그널 처리 테스트 코드 작성
  3. 2011.01.25 Java 에서 시그널 처리하기(Windows)
  4. 2011.01.01 [IBM dWs] Java SE 6, Ecipse, Ant 를 이용한 간단한 웹 서비스
  5. 2010.12.20 Short-circuit 확인 테스트 코드
  6. 2010.07.27 예외 메세지를 제대로 보여주기
  7. 2010.07.14 instanceof
  8. 2010.05.26 오랜만에 스트림을 다뤘더니 헤맨다. ㅎㅎ
  9. 2010.05.17 Unable to find a value for "PROPERTY" in object of class "CLASS" using operator "."
  10. 2010.04.14 Java Decompiler
  11. 2010.04.12 Java XPath API
  12. 2010.03.29 Call By Reference Vs Call By Value
  13. 2010.01.17 디컴파일한 소스를 컴파일하기
  14. 2009.12.27 윈도우에서 기본으로 실행되는 java 명령어의 위치는?
  15. 2009.11.13 java, javac 명령어

Comparable#compareTo()

BigDecimal expirtation = new BigDecimal("2012....");
BigDecimal now = new BigDecimal("2011....");
System.out.println(expirtation.compareTo(now)); // >, 1

expirtation = = new BigDecimal("2005....");
System.out.println(expirtation.compareTo(now)); // <, -1

boolean expired(){
    return expirtation.compareTo(now) < 0; 
    //만료일이 작으면(-1), 만료일이 지난 경우, expired? yes, 리턴 true
    //만료일이 크면(1), 아직 만료되지 않았으면, expired? no, 리턴 false
    //동일하면(0) 아직 만료되지 않았다, expired? no, 리턴 false
}

시그널 처리 테스트 코드 작성

- 인터럽트 거는 부분은 어떻게 작성해야 하나?

- 테스트를 작성하면서 알아낸 사실
testRaise() 에서 시그널을 발생시켜도 바로 전달되지 않는다는 것을 알게 되었다.
sleep 을 하지 않으면 테스트가 실패할 경우도 생긴다.

테스트 작성의 순기능인가...ㅎㅎ

Java 에서 시그널 처리하기(Windows)

Windows 환경에서는 제약사항이 있다.

> java SignalHandlerImpl
start
signal.name : TERM, signal.number : 15 //Signal.raise() 로 발생시킴.
Ctrl - C
signal.name : INT, signal.number : 2

end

- TERM, ABRT, ILL, SEGV 는 Windows 운영체제에서 발생되지 않는다.

- BREAK, FPE 도 사용할 수 없다.
Signal already used by VM: SIGBREAK

- QUIT 도 사용할 수 없다.
Unknown signal: QUIT

- MSDN signal

[IBM dWs] Java SE 6, Ecipse, Ant 를 이용한 간단한 웹 서비스

- Eclipse와 Java SE 6을 사용하여 독립형 웹 서비스 개발하기, Part 1: 웹 서비스 서버 애플리케이션
Create stand-alone Web services applications with Eclipse and Java SE 6, Part 1: The Web service server application
- Eclipse와 Java SE 6을 사용하여 독립형 웹 서비스 개발하기: Part 2: 웹 서비스 클라이언트 응용프로그램
Create stand-alone Web services applications with Eclipse and Java SE 6: Part 2: The Web service client application

- Java SE 6, Ecipse, Ant 를 이용해서 간단한 웹서비스를 구현하고 모니터링한다.

Java SE 6 JDK 설치
Eclipse JRE 설정

서버
Ant 를 실행시키면 com.myfirst.wsServer.jaxws 가 생김 서버를 실행시키고, Internal Web Browser 로 http://localhost:8080/wsServerExample?wsdl 을 입력하면 WSDL 을 볼 수 있다.

Eclipse 의 Web Services Explorer 를 이용해서 웹서비스를 테스트해 볼 수 있다.
Java EE Perspective 에서 Run - Launch the Web Services Explorer 을 선택하고
http://localhost:8080/wsServerExample?wsdl 를 호출해서 getGreeting 을 직접 호출해 본다.

클라이언트
wsimport 태스크를 실행하면 WSDL 를 참조해서 JAX-WS 관련 스텁?이 생성된다.
  • wsgen은 서비스 엔드 포인트 클래스를 읽고서 웹 서비스 전개 및 호출에 필요한 모든 아티팩트를 생성한다.
  • wsimport는 WSDL을 읽고서 웹 서비스 개발, 전개 및 호출에 필요한 모든 아티팩트를 생성한다.

- Eclipse TCP/IP Monitor 를 이용해서 모니터링을 할 수 있다.

Short-circuit 확인 테스트 코드


예외 메세지를 제대로 보여주기

에러메세지 앞부분에 자바 패키지명이 붙는 것을 없애자.
xxx.user.service.LoginException: 사용자 정보가 존재하지 않습니다.

메세지를 보아하니 Exception 클래스를 사용한 것 같은데 Exception#toString()을 그대로 쓴거 같다.
Exception#getMessage()를 이용하도록 수정하면 되겠네.

SpringMVC를 사용했으니깐  HandlerExceptionResolver 를 사용했을거고, 관련 설정을 확인해 본다.
모든 예외는 exception.jsp 로 이동함.(view를 찾을 때에는 viewResolver가 사용됨)
어라...제대로 처리하고 있는데...

예외를 생성한 곳을 보니
로그인을 처리하는 서비스에서 LoginException("사용자 정보가 존재하지 않습니다.") 을 발생시키고, 컨트롤러에서는 LoginException을 다시 생성해서 던지고 있다.

예외가 겹친 경우에도 위와 같은 메세지가 보인다.

exception.jsp에서 실제 예외를 찾아서 보여주자.

instanceof

오랜만에 스트림을 다뤘더니 헤맨다. ㅎㅎ

int java.io.InputStream.read() throws IOException
스트림으로부터 데이터를 읽는다.
리턴값은 읽어들인 바이트이고 0 ~ 255 사이의 값을 가진다.
스트림 끝에 도달해서 더이상 읽을 것이 없을때에는 -1을 리턴한다.

int java.io.InputStream.read(byte[] b) throws IOException
스트림으로부터 데이터를 읽어서 바이트 배열에 저장한다.
리턴값은 읽어들인 데이터의 길이이고, 스트림 끝에 도달해서 더이상 읽을 것이 없을때에는 -1을 리턴한다.
인자인 바이트 배열의 길이가 0인 경우 0을 리턴한다.(바이트 배열의 길이가 0보다 큰 경우에는 0을 리턴하지 않는다. 스트림 끝에 도달하면 -1을 리턴한다.)
java.io.FileOutputStream.FileOutputStream(File file) throws FileNotFoundException
출력할 파일이 없으면 예외가 발생한다.
이어쓰기를 하지 않는다.

Unable to find a value for "PROPERTY" in object of class "CLASS" using operator "."

javax.servlet.jsp.el.ELException: Unable to find a value for "PROPERTY" in object of class "CLASS" using operator "."

자바 빈 명명 규칙에 어긋나서 발생하는 에러임.

 멤버  getter  사용  비고
 S_PAR_POINT  getS_PAR_POINT()  ${data.s_PAR_POINT}  ${data.S_PAR_POINT}는 안됨.
 PAR_POINT  getPAR_POINT()  ${data.PAR_POINT}  
       

[todo] 자바 빈 명명 규칙을 정리할 필요있음. 어디에 있더라...

Java Decompiler

http://jd.benow.ca/

http://java.decompiler.free.fr/

일반 어플리케이션과 이클립스 플러그인이 있음.
쓸만하다.

jad와 비교했을때 장단점이 있는거 같다.


2016-08-03 디컴파일된 결과를 한번에 자바 소스 파일로 저장할 수도 있다.
2021-02-21 캐시를 먹는지 jar 내용이 변경되어도 이전 내용이 보임. 프로그램을 종료시켜서 다시 시작해야 함.

 

Java XPath API

- http://www.ibm.com/developerworks/kr/library/x-javaxpathapi.html

- Java 5에서 javax.xml.xpath패키지를 도입

- XML에서 저자가 Neal Stephenson인 모든 책을 찾으라는 XPath 쿼리는 다음과 같다.
//book[author="Neal Stephenson"]/title

Call By Reference Vs Call By Value

한번씩 까먹는다.
정말 기초가 중요하다.

- Call By Reference Vs Call By Value
- 테스트 작성[각주:1]
  1. 2011-02-10 추가 [본문으로]

디컴파일한 소스를 컴파일하기

jad로 디컴파일한 소스를 수정해서 다시 컴파일하려니 이런 에러가 발생한다.

WEB-INF\src>"C:\Program Files\Java\jdk1.6.0_12\bin\javac" -d . com/test/model/TestDAO.jav
a
com\test\model\TestDAO.java:159: not a statement
/* 173*/        exception;
                ^
com\test\model\TestDAO.java:236: not a statement
/* 258*/        exception;
                ^

[todo] 방법이 없나?

윈도우에서 기본으로 실행되는 java 명령어의 위치는?

PrcView의 Process Monitor로 확인해보면 C:\WINDOWS\system32\java.exe가 실행된다.
이 경로는 시스템 Path에서 제일 앞에 기술되어 있다.

[todo] 시스템에 설치된 jre를 사용하지 않고 내장된 jre를 사용하는 was인 경우도 확인해보자.

java, javac 명령어

src> "C:\Program Files\Java\jdk1.6.0_12\bin\javac" com/test/sample/Test.java
src> java com.test.sample.Test
Hi
src> "C:\Program Files\Java\jdk1.6.0_12\bin\javac" com/test/sample/Test.java
com\test\sample\Test.java:5: package org.apache.log4j does not exist
                org.apache.log4j.Logger logger;
                                ^
1 error

src> "C:\Program Files\Java\jdk1.6.0_12\bin\javac" -cp D:\lib\log4j-1.2.13.jar  com/test/sample/Test.java
src> java com.test.sample.Test
Hi
src> "C:\Program Files\Java\jdk1.6.0_12\bin\javac" -cp D:\lib\log4j-1.2.13.jar  com/test/sample/Test.java
src> java com.test.sample.Test
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Logger
        at com.test.sample.Test.main(Test.java:5)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
        ... 1 more

src>java -cp D:\lib\log4j-1.2.13.jar  com.test.sample.Test
Exception in thread "main" java.lang.NoClassDefFoundError: com/test/sample/Test
Caused by: java.lang.ClassNotFoundException: com.test.sample.Test
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: com.test.sample.Test.  Program will exit.

src> java -cp D:\lib\log4j-1.2.13.jar;.  com.test.sample.Test
Hi