[JAVA] DateUtil2

JAVA 2017. 11. 1. 17:29

DateUtil2


package kr.co.leecom.lcms.util;

import java.lang.StringBuffer;

import java.text.DecimalFormat;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import org.apache.log4j.Logger;

import kr.co.leecom.lcms.util.Lunar;

import java.util.Date;

import java.util.StringTokenizer;

import java.util.Calendar; 

import java.util.GregorianCalendar;


public class DateBean {

private static Logger logger = Logger.getLogger(TextBean.class);


/**

 * 기본생성자

*/


public DateBean() {

}


/**

 * 년을 리턴한다.

 * @param date String yyyyMMdd format이어야 한다.

 * @return String

*/


public String getYear(String date) {

date = removeChar(date, "/");

date = removeChar(date, "-");

date = removeChar(date, ".");

return date.substring(0, 4);

}


/**

 * 월을 리턴한다.

 * @param date String yyyyMMdd format이어야 한다.

 * @return String

*/


public String getMonth(String date) {

date = removeChar(date, "/");

date = removeChar(date, "-");

date = removeChar(date, ".");

return date.substring(4, 6);

}


/**

 * 쿼터를 리턴한다.

 * @param date String yyyyMMdd format이어야 한다.

 * @return String

*/


public String getQuarter(String date) {

date = removeChar(date, "/");

date = removeChar(date, "-");

date = removeChar(date, ".");


if (Integer.parseInt(date.substring(4, 6)) < 4) {

return "1";

} else if (Integer.parseInt(date.substring(4, 6)) < 7) {

return "2";

} else if (Integer.parseInt(date.substring(4, 6)) < 10) {

return "3";

} else if (Integer.parseInt(date.substring(4, 6)) < 13) {

return "4";

}

return "";

}


/**

 * 일을 리턴한다.

 * @param date String yyyyMMdd format이어야 한다.

 * @return String

*/


public String getDay(String date) {

date = removeChar(date, "/");

date = removeChar(date, "-");

date = removeChar(date, ".");

return date.substring(6);

}


/**

 * 오늘 날짜를 format의 형태로 리턴한다. <p>

 * yyyyMMdd <p>

 * yyyy-MM-dd <p>

 * yyyy-MM-dd HH:mm:ss <p>

 * HHmmss <p>

 * HH:mm:ss <p>

 * yyyy <p>

 * MM <p>

 * dd <p>

 * yyyyMM <p>

 * yyyyMMddHHmmss <p>

 * @param format String

 * @return String

*/


public String date(String format) {

java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat(format,java.util.Locale.KOREA);


return formatter.format(new java.util.Date());

}


/**

 * 오늘 날짜를 format의 형태로 리턴한다. <p>

 * yyyyMMdd <p>

 * yyyy-MM-dd <p>

 * yyyy-MM-dd HH:mm:ss <p>

 * HHmmss <p>

 * HH:mm:ss <p>

 * yyyy <p>

 * MM <p>

 * dd <p>

 * yyyyMM <p>

 * yyyyMMddHHmmss <p>

 * @param format String

 * @param date Date

 * @return String

*/


public String date(String format, java.util.Date date) {

java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat(format, java.util.Locale.KOREA);

 

return formatter.format(date);

}


/**

  * 특정 날짜를 format의 형태의 일자로 리턴한다. <p>

  * yyyyMMdd <p>

  * yyyy-MM-dd <p>

  * HHmmss <p>

  * HH:mm:ss <p>

  * yyyy <p>

  * MM <p>

  * dd <p>

  * yyyyMM <p>

  * @param format String

  * @param date String

  * @return String

 */


public String date(String format, String date) {

String result = null;


try {

SimpleDateFormat f = null;

SimpleDateFormat sdf = null;

if (date == null)

return "";

date = date.trim();

date = removeChar(date, "/");

date = removeChar(date, "-");

date = removeChar(date, "."); 


if (date.equals(""))

return "";

sdf = new SimpleDateFormat("yyyyMMdd");

f = new SimpleDateFormat(format);

result = f.format(new java.util.Date(sdf.parse(date).getTime()));

}catch (Exception e) {

System.out.println("FormatUtil::date(String format, String date) ERROR : " + e.getMessage());

}


return result;

}


/**

 * 특정 날짜에서 년,월,일을 특정수만큼 더한다.

 * @param format String

 * @param date String

 * @param field String

 * @param amount int

 * @param strTime String

*/


public String addDate(String format, String date, String field, 

int amount) {


if (field != null)

field = field.toUpperCase();

SimpleDateFormat fmt = new SimpleDateFormat(format);

Calendar cal = new GregorianCalendar();


int year = 0;

int month = 0;

int day = 0;

if (getYear(date) != null)

year = Integer.parseInt(getYear(date));


if (getMonth(date) != null)

month = Integer.parseInt(getMonth(date));


if (getDay(date) != null)

day = Integer.parseInt(getDay(date));


cal.set(year, month - 1, day);


if (field.equals("YEAR"))

cal.add(Calendar.YEAR, amount);


if (field.equals("MONTH"))

cal.add(Calendar.MONTH, amount);


if (field.equals("DAY"))

cal.add(Calendar.DATE, amount);


String strTime =

fmt.format(new java.util.Date(cal.getTime().getTime()));

 

return strTime;

}


/**

  * 지정된 달의 최초 일자를 리턴한다.

  * @param format 리턴되는 날짜의 포멧

  * @param date yyyyMMdd 형태의 날짜

  * @return String

 */


public String getFirstDateOfMonth(String format, String date) {


SimpleDateFormat fmt = new SimpleDateFormat(format);

Calendar cal = new GregorianCalendar();


int year = 0;

int month = 0;

int day = 0;

int firstDay = 0;


if (getYear(date) != null)

year = Integer.parseInt(getYear(date));


if (getMonth(date) != null)

month = Integer.parseInt(getMonth(date));


if (getDay(date) != null)

day = Integer.parseInt(getDay(date));


cal.set(year, month - 1, day);


firstDay = cal.getActualMinimum(Calendar.DAY_OF_MONTH);

cal.set(Calendar.DATE, firstDay);

String result = fmt.format(new java.util.Date(cal.getTime().getTime()));


return result;

}


/**

  * 지정된 달의 마지막 일자를 리턴한다.

  * @param format 리턴되는 날짜의 포멧

  * @param date yyyyMMdd 형태의 날짜

  * @return String

 */


public String getLastDateOfMonth(String format, String date) {


SimpleDateFormat fmt = new SimpleDateFormat(format);

Calendar cal = new GregorianCalendar();


int year = 0;

int month = 0;

int day = 0;

int lastDay= 0;


if (getYear(date) != null)

year = Integer.parseInt(getYear(date));


if (getMonth(date) != null)

month = Integer.parseInt(getMonth(date));


if (getDay(date) != null)

day = Integer.parseInt(getDay(date));


cal.set(year, month - 1, day);


lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);

cal.set(Calendar.DATE, lastDay);

String result = fmt.format(new java.util.Date(cal.getTime().getTime()));


return result; 

}


/**

  * 이전달의 마지막 일자를 리턴한다.

  * @param format 리턴되는 날짜의 포멧

  * @return String

 */


public String getLastDateOfBeforeMonth(String format) {


SimpleDateFormat fmt = new SimpleDateFormat(format);

Calendar cal = new GregorianCalendar();

cal.add(Calendar.MONTH, -1);


int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);

cal.set(Calendar.DATE, lastDay);


String result = fmt.format(new java.util.Date(cal.getTime().getTime()));


return result;

}


/**

  * 지정된 두 날짜 사이의 차이를 구한다.

  * @param format 리턴되는 날짜의 포멧

  * @param staetdt 시작일자

  * @param enddt 종료일자

  * @return long

 */


public long getDayDistance( String startdt, String enddt) 

throws Exception{


String format = "yyyyMMdd";


SimpleDateFormat sdf = new SimpleDateFormat(format);

Date sDate;

Date eDate;


startdt = removeChar(startdt, "/");

startdt = removeChar(startdt, "-");

startdt = removeChar(startdt, ".");


enddt = removeChar(enddt, "/");

enddt = removeChar(enddt, "-");

enddt = removeChar(enddt, ".");


long day2day = 0;


try {

sDate = sdf.parse(startdt);

eDate = sdf.parse(enddt);

day2day = (eDate.getTime() - sDate.getTime()) / (1000*60*60*24);

}catch (Exception e) {

throw new Exception ("wrong format string" + e.toString());

}


return Math.abs(day2day);

}


/**

  * 지정된 두 날짜 사이의 오늘날자가 포함되어있느지 0사이, 

  * 1미래, -1과거

  * @param startdt 시작일자

  * @param enddt 종료일자

  * @return String

 */


public String getBetweenDate( String startdt, String enddt) throws Exception {


startdt = removeChar(startdt, "/");

startdt = removeChar(startdt, "-");

startdt = removeChar(startdt, ".");

enddt = removeChar(enddt, "/");

enddt = removeChar(enddt, "-");

enddt = removeChar(enddt, ".");


String curdate = this.date("yyyyMMdd");


if ((Integer.parseInt(curdate, 10) >= Integer.parseInt(startdt, 10)) && (Integer.parseInt(curdate, 10)<=Integer.parseInt(enddt, 10))) {

return "0";

} else if (Integer.parseInt(curdate, 10) < Integer.parseInt(startdt, 10)){

      return "1";

 } else if (Integer.parseInt(curdate, 10) > Integer.parseInt(enddt, 10)) {

       return "-1";

 } else {

       return "";

 }

}


/**

  * 지정된 일자의 이전달의 마지막 일자를 리턴한다.

  * @param format 리턴되는 날짜의 포멧

  * @param date yyyyMMdd 형태의 날짜

  * @return String

 */


public String getLastDateOfBeforeMonth(String format, String date) {


SimpleDateFormat fmt = new SimpleDateFormat(format);

Calendar cal = new GregorianCalendar();


int year = 0;

int month = 0;

int day = 0;

int lastDay = 0;


if (getYear(date) != null)

year = Integer.parseInt(getYear(date));


if (getMonth(date) != null)

month = Integer.parseInt(getMonth(date));


if (getDay(date) != null)

day = Integer.parseInt(getDay(date));


cal.set(year, month - 1, day);

cal.add(Calendar.MONTH, -1);


lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);

cal.set(Calendar.DATE, lastDay);


String result = fmt.format(new java.util.Date(cal.getTime().getTime()));


return result;

}


/**

 * 현재 index에 대한 요일을 리턴

 * @param nWeek int

 * @return String sWeekDayKr

*/


public String getWeekDayKr(int nWeek) {

String sWeekDayKr = "";


if (nWeek == 0)

sWeekDayKr = "일";


else if (nWeek == 1)

sWeekDayKr = "월";

else if (nWeek == 2)

sWeekDayKr = "화";

     else if (nWeek == 3)

     sWeekDayKr = "수";

else if (nWeek == 4)

sWeekDayKr = "목";

else if (nWeek == 5)

sWeekDayKr = "금";

else if (nWeek == 6)

sWeekDayKr = "토";


return sWeekDayKr;

}


/**

 * 입력된 일짜의 요일을 리턴한다.

 * @param date String 날짜

 * @return int getWeekDay

*/


public int getWeekDay(String date) {

SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");


Calendar cal = new GregorianCalendar();


int year = 0;

int month = 0;

int day = 0;


if (getYear(date) != null)

year = Integer.parseInt(getYear(date));

if (getMonth(date) != null)

month = Integer.parseInt(getMonth(date));

if (getDay(date) != null)

day = Integer.parseInt(getDay(date));


cal.set(year, month - 1, day);

return cal.get(Calendar.DAY_OF_WEEK) - 1;

}


/**

 * TEXT관련 나중에 검사한후 TEXTBEAN으로 옮겼으면...

 * @author pdspds

 *

 * TODO To change the template for this generated type comment go to

 * Window - Preferences - Java - Code Style - Code Templates

*/

/**

 * String형 str에서 특정 String형 character를 제거한후 리턴

 * @param str String 변환한 문자열

 * @param character String 제거할 문자

*/


public String removeChar(String str, String character) {


StringTokenizer st = null;

StringBuffer buf = null;

String result = null;

char c;

result = str;


for (int i = 0; i < character.length(); i++) {

c = character.charAt(i);

st = new StringTokenizer(result, String.valueOf(c));

buf = new StringBuffer();


while (st.hasMoreTokens()) {

buf.append(st.nextToken());

}

result = buf.toString();

}

return result;

}


/**

 * int형을 스트링으로 변환

 * (앞에 "0"을 붙여서 자리수를 맞추어서 리턴)

 * @param value int 변환할 숫자 

 * @param unit int 전체 자릿수

 * @return String

*/


public String toUnit(int value, int unit) {

String str = new String();

str = Integer.toString(value);


while (str.length() < unit) {

str = "0" + str;

}

return str;

}


public String toLunar(String date) {


if (date == null)

return "";


date = date.trim();

date = removeChar(date, "/");

date = removeChar(date, "-");

date = removeChar(date, ".");


if (date.equals("") || date.length() < 8)

return "";


int year = 0;

int month = 0;

int day = 0;


if (getYear(date) != null)

year = Integer.parseInt(getYear(date));

if (getMonth(date) != null)

month = Integer.parseInt(getMonth(date));

if (getDay(date) != null)

day = Integer.parseInt(getDay(date));


Lunar lunar = new Lunar();

return lunar.countToDateForLunar(lunar.countSolarDay(year, month, day));

}


public String toSolar(String date) {


if (date == null)

return "";


date = date.trim();

date = removeChar(date, "/");

date = removeChar(date, "-");

date = removeChar(date, ".");


if (date.equals("") || date.length() < 8)

return "";


int year = 0;

int month = 0;

int day = 0;


if (getYear(date) != null)

year = Integer.parseInt(getYear(date));

if (getMonth(date) != null)

month = Integer.parseInt(getMonth(date));

if (getDay(date) != null)

day = Integer.parseInt(getDay(date));


Lunar lunar = new Lunar();


return lunar.countToDateForSolar(lunar.countLunarDay(year, month, day, false));

}


public static String getDateNTimeByForm(String sDateNTimeForm) {


Calendar Today = new GregorianCalendar();

SimpleDateFormat sdf = new SimpleDateFormat(sDateNTimeForm);


String sDateNTime = sdf.format(Today.getTime() );


return sDateNTime;

}


/**

  * 오늘날짜와 비교 몇일인자 Long 반환

  *

  * @param 비교 날짜 ex)yyyy.MM.dd

  * @return 비교 차 ex) 2321

  * @throws ParseException 

  * @throws ParseException 

 */


public static long compare2Date(String end) 

throws ParseException {


try{

if(end.length() != 8 && end.length() !=14 ){

throw new Exception();

}


SimpleDateFormat formatter =

new SimpleDateFormat("yyyy-MM-dd");


Calendar cal = Calendar.getInstance();

cal.set(Calendar.DATE , cal.get(Calendar.DATE));


DecimalFormat df = new DecimalFormat("00");


Date beginDate = formatter.parse(Integer.toString(cal.get(Calendar.YEAR)) + "-" + df.format(cal.get(Calendar.MONTH)+1) + "-" + df.format(cal.get(Calendar.DATE)));


Date endDate = formatter.parse(end.substring(0,4)+ "-" + end.substring(4,6) + "-" + end.substring(6,8));


return (endDate.getTime() - beginDate.getTime()) / 

(60 * 1000);   

}catch (Exception e) {

return -40000;

}

}

}

'JAVA' 카테고리의 다른 글

[JAVA]Dispatche :: request.getRequestDispatcher("/prg/board_excel.jsp");  (0) 2017.11.03
[JAVA]dbconnection 끊어지는 현상  (0) 2017.11.03
[JAVA]DateUtil  (0) 2017.11.01
[JAVA] context root path  (0) 2017.11.01
[JAVA] CMYK 이미지 처리  (0) 2017.11.01
블로그 이미지

마크제이콥스

초보 개발자의 이슈및 공부 내용 정리 블로그 입니다.

,

[JAVA]DateUtil

JAVA 2017. 11. 1. 16:42

DateUtil


package com.uportal.cm.singler.util;


import java.util.Calendar;

import java.util.GregorianCalendar;



/**
 * <pre>
 * 날짜와 관련된 유용한 함수들의 모음.
 * <p>
 * ==========================================
 * Version : V1.0
 * Date : 20040908
 * Description : 최초생성
 * Edited by : 윤호영
 * ------------------------------------------
 * ==========================================
 * </pre>
 * 
 */

public class DateUtil extends Util {
/**
 * 오늘 날짜를 받아온다. yyyy-mm-dd
 * @return  오늘날짜
**/

public static String getToday() {
GregorianCalendar calendar = new GregorianCalendar();
StringBuffer returnString = new StringBuffer();

returnString.append(checkByte(Integer.toString(calendar.get(Calendar.YEAR)), 4, "0") + "-");

returnString.append(checkByte(Integer.toString(calendar.get(Calendar.MONTH) + 1), 2, "0") + "-");

returnString.append(checkByte(Integer.toString(calendar.get(Calendar.DATE)), 2, "0"));

return returnString.toString();
}

/**
 * 오늘 날짜를 받아온다. yyyymmdd
 * @return  오늘날짜
**/

public static String getToday8() {
GregorianCalendar calendar = new GregorianCalendar();
 StringBuffer returnString = new StringBuffer();

 returnString.append(checkByte(Integer.toString(calendar.get( Calendar.YEAR)), 4, "0"));

 returnString.append(checkByte(Integer.toString(calendar.get( Calendar.MONTH) + 1), 2, "0"));

 returnString.append(checkByte(Integer.toString(calendar.get( Calendar.DATE)), 2, "0"));

 return returnString.toString();
}

/**
 * 현재 시간을 받아온다. hh:mi:ss
 * @return  현재시간
**/

public static String getTime() {
GregorianCalendar calendar = new GregorianCalendar();
StringBuffer returnString = new StringBuffer();

  returnString.append(checkByte(Integer.toString(calendar.get(Calendar.HOUR_OF_DAY)), 2, "0") + ":");
  returnString.append(checkByte(Integer.toString(calendar.get(Calendar.MINUTE)), 2, "0") + ":");
  returnString.append(checkByte(Integer.toString(calendar.get(Calendar.SECOND)), 2, "0"));

 return returnString.toString();
 }

/**
 * 현재 시간을 받아온다. hhmiss
 * @return  현재시간
**/
public static String getTime6() {
GregorianCalendar calendar = new GregorianCalendar();
StringBuffer returnString = new StringBuffer();

  returnString.append(checkByte(Integer.toString(calendar.get(Calendar.HOUR_OF_DAY)), 2, "0"));
  returnString.append(checkByte(Integer.toString(calendar.get(Calendar.MINUTE)), 2, "0"));
  returnString.append(checkByte(Integer.toString(calendar.get(Calendar.SECOND)), 2, "0"));

 return returnString.toString();
 }

/**
 * 현재 시간중 1/1000초 부분을 받아온다.
 * @return  1/1000초
**/

public static String getMilli() {
GregorianCalendar calendar = new GregorianCalendar();
StringBuffer returnString = new StringBuffer();
  returnString.append(checkByte(Integer.toString(calendar.get(Calendar.MILLISECOND)), 3, "0"));

return returnString.toString();
 }

/**
 * 현재 날짜와 시간을 받아온다. yyyy-mm-dd hh:mi:ss
 * @return  현재 날짜와 시간
**/

public static String getCurrent() {
return (getToday() + " " + getTime());
}

/**
 * 현재 날짜와 시간을 받아온다. yyyymmddhhmiss
 * @return  현재 날짜와 시간
**/

public static String getCurrent14() {
return (getToday8() + getTime6());
}

/**
 * 현재 날짜, 시간, 1/1000초를 받아온다. 
 * yyyy-mm-dd hh:mi:ss  sss
 * @return  날짜 + 시간 + 1/1000초
**/

public static String getCurrentMilli() {
return (getToday() + " " + getTime() + " " + getMilli());
}

/**
 * 현재 날짜, 시간, 1/1000초를 받아온다. yyyymmddhhmisssss
 * @return  날짜 + 시간 + 1/1000초
**/

public static String getCurrentMilli17() {
return (getToday8() + getTime6() + getMilli());
}
}



[출처] DateUtil.java (JSP+WEB) |작성자 포지티브

'JAVA' 카테고리의 다른 글

[JAVA]dbconnection 끊어지는 현상  (0) 2017.11.03
[JAVA] DateUtil2  (0) 2017.11.01
[JAVA] context root path  (0) 2017.11.01
[JAVA] CMYK 이미지 처리  (0) 2017.11.01
[JAVA] CmmProgramService 가져와 실행해 봅시다.  (0) 2017.11.01
블로그 이미지

마크제이콥스

초보 개발자의 이슈및 공부 내용 정리 블로그 입니다.

,

[JAVA] context root path

JAVA 2017. 11. 1. 11:34

context root path


Servlet

절대경로


getServletContext().getRealPath("/")); // 웹서버의 Document Root

ex) getServletContext().getRealPath("/WEB-INF/web.xml")); 


또는 


config.getServletContext().getRealPath("/");

 

또는

 

getServletConfig().getServletContext().getRealPath("/");

 

또는

 

request.getSession().getServletContext().getRealPath("/");



 

JAVA


절대경로


this.getClass().getResource("").getPath(); // 현재 자신의 절대 경로

 

this.getClass().getResource("/").getPath(); // classes 폴더의 최상위 경로

 

this.getClass().getResource("/com/test/config/config.properties").getPath(); // classes 폴더에서부터 시작하여 해당파일까지의 절대 경로

 

this.getClass().getProtectionDomain().getCodeSource().getLocation(); // 자신의 파일명(*.class)이 포함된 절대경로

 

 

 

System.getProperty("user.home"); // 사용자 홈 디렉토리

 

System.getProperty("user.dir");  // 이클립스에서 실행시 이클립스 워크스페이스 (해당 프로젝트명 전까지)




ClassLoader 사용법


ClassLoader classLoader = (Thread.currentThread()).getContextClassLoader();

 

if(classLoader==null) classLoader = ClassLoader.getSystemClassLoader();

 

URL url = classLoader.getResource("struts.properties");

 

System.out.println(url.getPath());

 

WEB-INF/classes 에 있는 리소스만 참조합니다.

 

WEB-INF 와 같이 바로 아래에 있는 있는 리소스는 참조하지 못합니다.

 

getSystemClassLoader는 java application에서 사용되는 방법이고

 

(Thread.currentThread()).getContextClassLoader() 는 web에서 사용되는 방법입니다.


현재 클래스가 상속되는(부모) 클래스라면 클래스명.class.getResource 로 해야 합니다.

 

getClass()는 실행되는 현재 자신(자식클래스가 될 수 있습니다.)을 가리키기 때문입다.

 

WEB의 절대경로와는 다릅니다.


new File("").getAbsolutePath() : 절대경로

 

new File("").getCanonicalPath() : 상대경로


[출처] http://blog.naver.com/tyboss/70055965418 

'JAVA' 카테고리의 다른 글

[JAVA] DateUtil2  (0) 2017.11.01
[JAVA]DateUtil  (0) 2017.11.01
[JAVA] CMYK 이미지 처리  (0) 2017.11.01
[JAVA] CmmProgramService 가져와 실행해 봅시다.  (0) 2017.11.01
[JAVA]ClassLoader2  (0) 2017.11.01
블로그 이미지

마크제이콥스

초보 개발자의 이슈및 공부 내용 정리 블로그 입니다.

,

[JAVA] CMYK 이미지 처리

JAVA 2017. 11. 1. 11:09

CMYK 이미지 처리


File f = new File("/path/imagefile.jpg");

// Find a suitable ImageReader


Iterator readers = ImageIO.getImageReadersByFormatName("JPEG");


ImageReader reader = null;


while(readers.hasNext()){

reader = (ImageReader)readers.next();


if(reader.canReadRaster()){

break;

}

}


// Stream the image file (the original CMYK image)

ImageInputStream input = ImageIO.createImageInputStream(f); 

reader.setInput(input);


//Read the image raster

Raster raster = reader.readRaster(0, null);


//Create a new RGB image

BufferedImage bi = new BufferedImage(raster.getWidth(), raster.getHeight(), 

BufferedImage.TYPE_4BYTE_ABGR);


//Fill the new image with the old raster

bi.getRaster().setRect(raster);


[출처] 

http://stackoverflow.com/questions/8118712/java-cmyk-to-rgb-with-profile-output-is-too-dark 



'JAVA' 카테고리의 다른 글

[JAVA]DateUtil  (0) 2017.11.01
[JAVA] context root path  (0) 2017.11.01
[JAVA] CmmProgramService 가져와 실행해 봅시다.  (0) 2017.11.01
[JAVA]ClassLoader2  (0) 2017.11.01
[JAVA] ClassLoader  (0) 2017.10.30
블로그 이미지

마크제이콥스

초보 개발자의 이슈및 공부 내용 정리 블로그 입니다.

,

CmmProgramService 가져와 실행해 봅시다.


public void testForInsert() throws Exception {

ProxyFactoryBean pb = context.getBean("&loggerProgramServiceProxy",     ProxyFactoryBean.class);

      System.out.println(pb.getObject());


      CmmProgramService<ZValue> dp =         (CmmProgramService<ZValue>)pb.getObject();


      ParameterContext<ZValue> paramCtx = new ParameterContext<ZValue>();

      ZValue param = new ZValue();


      paramCtx.setParam(param);

      paramCtx.setRequest(new MockHttpServletRequest());

      paramCtx.setResponse(new MockHttpServletResponse());

      paramCtx.setModel(new ModelMap());


      dp.forInsert(paramCtx);

 }

'JAVA' 카테고리의 다른 글

[JAVA] context root path  (0) 2017.11.01
[JAVA] CMYK 이미지 처리  (0) 2017.11.01
[JAVA]ClassLoader2  (0) 2017.11.01
[JAVA] ClassLoader  (0) 2017.10.30
[JAVA]classes 위치 가져오기  (0) 2017.10.30
블로그 이미지

마크제이콥스

초보 개발자의 이슈및 공부 내용 정리 블로그 입니다.

,

[JAVA]ClassLoader2

JAVA 2017. 11. 1. 10:57

ClassLoader2 


자바 2 플랫폼에서 클래스로더의 인터페이스와 semantic은 개발자들이 자바 클래스로딩 메너니즘을 빠르고 쉽게 확장할 수 있도록 하기 위해 몇몇 부분을 재정의되었습니다. 그 결과 1.1이나 1.0에 맞게 작성된 (커스텀 클래스로더를 포함합니다.) 클래스로더는 자바 2 플랫폼에서는 제기능을 하지 못할 수도 있으며, 클래스로더 사용하기 위해 작성했던 코드를 재작성하는 것이 그렇게 간단하지만은 않습니다.

자바 1.x와 자바 2에서 클래스로더에 있어서 가장 큰 차이점은 자바 2의 클래스로더는 부모 클래스로더(상위 클래스가 아닙니다)를 갖고 있다는 점입니다. 

자바 1.x의 클래스로더와는 달리, 자바 2의 클래스로더는 부모 클래스로더가 먼저 클래스를 로딩하도록 합니다.

이를 클래스로더 딜리게이션 모델(ClassLoader Delegation Model)이라고 하며, 이것이 바로 이전 버전의 클래스로더와 가장 큰 차이점이다.

자바 2의 클래스로더 딜리게이션 모델에 대해 구체적으로 알아보기 위해 로컬파일시스템과 네트워크로부터 클래스를 읽어와야 할 필요가 있다고 가정해봅니다. 

이 경우, 쉽게 로컬파일시스템의 jar 파일로부터 클래스를 읽어오는 클래스로더와 네트워크로부터 클래스를 읽어오는 클래스로더가 필요하다는 것을 생각할 수 있습니다. 

이 두 클래스로더를 각각 JarFileClassLoaderNetworkClassLoader라고 가정 합니다.

JDK 1.1에서, 커스텀 클래스로더를 만들기 위해서는 ClassLoader 클래스를 상속받은 후에 loadClass() 메소드를 오버라이딩하고, loadClass() 메소드에서 바이트코드를 읽어온 후, defineClass() 메소드를 호출하면 됩니다. 

여기서 defineClass() 메소드는 읽어온 바이트코드로부터 실제 Class 인스턴스를 생성해서 리턴합니다. 예를 들어, JarFileClassLoader는 다음과 같은 형태를 지닐 것입니다.


public class JarFileClassLoader extends ClassLoader {

........

private byte[] loadClassFromJarFile(String className){

// 지정한 jar 파일로부터 className에 해당하는 클래스의

// 바이트코드를 byte[] 배열로 읽어온다.

.......

return byteArr;

}


public synchronized class loadClass(String className, boolean resolveIt) throws ClassNotFoundException {


Class klass = null;


//클래스를 로드할 때, 캐시를 사용할 수 있다.

klass = (Class) cache.get(className);


if (klass != null) return klass;


// 캐쉬가 없을 경우, 시스템 클래스로더로 부터

// 지정한 클래스가 있는지 알아봅니다.


try{

klass = super.findSystemClass(className);

return klass;

}catch(ClassNotFoundException ex){

// do nothing

}


// Jar 파일로부터 className이 나타내는 클래스를 읽어온다.

byte[] byteArray = loadClassFromJarFile(className);

klass = defineClass(byteArray, 0, byteArray.length);


if (resolve)

resolveClass(klass);

cache.put(className, klass);    // 캐쉬에 추가

return klass;

}

}


위의 개략적인 코드를 보게되면, 시스템 클래스로더에게 이름이 className인 클래스가 존재하는지 요청을 합니다.

(여기서 시스템 클래스로더 또는 primordial 시스템 클래스로더는 부트스트랩 클래스로더입니다). 그런 후에, 시스템 클래스로더로부터 클래스를 읽어올 수 없는 경우 Jar 파일로부터 읽어옵니다. 이 때, className은 완전한 클래스 이름(qualified class name; 즉, 패키지이름을 포함한)입니다. NetworkClassLoader 클래스 역시 이 클래스와 비슷한 형태로 이루어져 있을 것입니다. 

'JAVA' 카테고리의 다른 글

[JAVA] CMYK 이미지 처리  (0) 2017.11.01
[JAVA] CmmProgramService 가져와 실행해 봅시다.  (0) 2017.11.01
[JAVA] ClassLoader  (0) 2017.10.30
[JAVA]classes 위치 가져오기  (0) 2017.10.30
[JAVA] Class.forName 사용하기  (0) 2017.10.30
블로그 이미지

마크제이콥스

초보 개발자의 이슈및 공부 내용 정리 블로그 입니다.

,

[JAVA] ClassLoader

JAVA 2017. 10. 30. 16:04

ClassLoader


ClassLoader cl = . . . //ClassLoader의 객체를 생성합니다.


Class klass = null;

  try {

     klass = cl.loadClass("java.util.Date");

  } catch(ClassNotFoundException ex) {

     // 클래스를 발견할 수 없을 경우에 발생합니다.

     ex.printStackTrace();

  }

'JAVA' 카테고리의 다른 글

[JAVA] CmmProgramService 가져와 실행해 봅시다.  (0) 2017.11.01
[JAVA]ClassLoader2  (0) 2017.11.01
[JAVA]classes 위치 가져오기  (0) 2017.10.30
[JAVA] Class.forName 사용하기  (0) 2017.10.30
[JAVA] class 클래스 로딩  (0) 2017.10.30
블로그 이미지

마크제이콥스

초보 개발자의 이슈및 공부 내용 정리 블로그 입니다.

,

classes 위치 가져오기 



getClass().getResource("/").getPath()



'JAVA' 카테고리의 다른 글

[JAVA]ClassLoader2  (0) 2017.11.01
[JAVA] ClassLoader  (0) 2017.10.30
[JAVA] Class.forName 사용하기  (0) 2017.10.30
[JAVA] class 클래스 로딩  (0) 2017.10.30
[JAVA] class 동적로딩  (0) 2017.10.30
블로그 이미지

마크제이콥스

초보 개발자의 이슈및 공부 내용 정리 블로그 입니다.

,

Class.forName 사용하기


JAVA.LANG.CLASS클래스


클래스의 정보를 얻기위한 클래스 

즉, 클래스의 정보를 얻어오는 클래스입니다.


forName() : 물리적인 클래스 파일명을 인자로 넣어주면 이에 해당하는 클래스를 반환해줍니다.

클래스를 조사하기 위한 클래스입니다.

변수로 클래스를 만들때 Class.forName 은 유용하게 쓰인다.


예제소스 (물리적인 WhitePerson 클래스를 인스턴스한다.)


try{

Class c = Class.forName("poly.WhitePerson");

// 로딩단계(클래스조사),메모리에 올라오지는 않음(newInstance()해줘야함)

Person p=(WhitePerson)c.newInstance();

// newInstance() 반환형이 Object형이므로 다운캐스팅한다.

}catch(ClassNotFoundException e1){

//클래스를 찾지못했을 경우에 대한 예외사항 

System.out.println("클래스가 존재하지 않습니다.");

}catch(InstantiationException e2){

//인스턴스(new)실패시에 대한 예외사항

System.out.println("메모리에 올릴수 없습니다.");

}catch(IllegalAccessException e3){

//파일접근에 대한 예외사항 

System.out.println("클래스파일 접근 오류입니다.");

}


종합예제 소스

물리적(폴더)에 있는 클래스 (WhitePerson/BlackPerson/YellowPerson)

를 입력받아 해당클래스를 로딩&생성하여 속성(color 변수)에 대한 값을 출력!!!!!

 

[1] 사용자가 입력한 문자열에 해당하는 클래스를 얻어옵니다.

[2] 얻어온 클래스를 메모리에 올린후 

[3] 해당 메서드를 실행합니다.


1. package classtest;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import poly.*;


public class ClassApp extends JFrame implements ActionListener{

private JPanel p;

private JLabel la;

private JTextField txt1, txt2;

private JButton bt;


public ClassApp(){

p=new JPanel();

la=new JLabel("생성할 클래스 입력");

txt1=new JTextField(15);

txt2=new JTextField(15);

bt=new JButton("생성");

p.add(txt1);

p.add(bt);

p.add(txt2);

add(p);

bt.addActionListener(this);

setSize(200,150);

setVisible(true);

}


public void actionPerformed(ActionEvent ae){

String className = txt1.getText();


try{

Class c=Class.forName(className);

// 로딩단계(클래스조사), 메모리에 올라오지는 않음

Person p = (Person)c.newInstance();

txt2.setText(p.getColor());

}catch(ClassNotFoundException e1) {

//클래스를 찾지못했을 경우에 대한 예외사항

txt2.setText("클래스가 없습니다.");

}catch(InstantiationException e2){

// 인스턴스(new)실패시에 대한 예외사항

txt2.setText("인스턴스를 생성할수 없습니다.");

}catch(IllegalAccessException e3){

//파일접근에 대한 예외사항

txt2.setText("엑세스 할수 없습니다.");

}

}


public static void main(String[] args){

new ClassApp();

}

}


Class.forName()ClassLoader.loadClass() 차이점


일단 Class.forName() 메서드는 인자가 한 개 짜리인 것과 세 개 짜리인 것이 있습니다.


static Class<?>     forName(String className)

          Returns the Class object associated with the class or interface with the given string name.



static Class<?>     forName(String name, boolean initialize, ClassLoader loader)

          Returns the Class object associated with the class or interface with the given string name, using the given class loader.


1. 클래스를 로딩할 때 사용되는 클래스로더 차이


인자가 한개 짜리인 forName(String) 메서드는 클래스를 로딩할 때 사용하는 클래스로더가 저 코드를 실행하는 클래스로더가 됩니다. 하지만 ClassLoader.loadClass()를 사용하면 당연히 자기 자신을 사용해서 클래스 로딩을 실행하게 되죠. 

(그렇다고 해서 반드시 해당 클래스로더가 읽어온다는 보장은 없죠. 그 부모가 읽어올 수도 있고 클래스 패스에 없을 수도 있고 암튼 여기서 로딩한다는 건 로딩을 시도한다고 보시기 바랍니다.)


하지만 Class.forName(String, boolean, ClassLoader)를 사용하면 클래스 로더를 지정해 줄 수 있습니다.



2. 초기화


Class.forName(String) 메서드를 사용하면 곧바로 클래스의 static 초기화 블럭과 static 멤버 변수의 값을 초기화 합니다. 하지만 ClassLoader.loadClass()를 사용하면 해당 클래스를 처음으로 사용하기 전까지 초기화가 지연됩니다.

이것 역시 Class.forName(String, boolean, ClassLoader)의 두번째 인자값을 이용하여 조절할 수 있습니다.


- 클래스 초기화 에러

만약 Class.forName(String)을 사용해서 로딩할 때 static 영역에서 에러가 난다면 해당 클래스는 다시 로딩할 수가 없습니다. 특정 클래스로더가 일단 로딩한 클래스는 다시 로딩할 수가 없죠. 

그래서 NoClassDefinitionFound 에러가 날 수도 있습니다.

이때는 해당 클래스로더 인스턴스를 버리고 새로 만들어야 하는데 그럴 때를 대비해 인자 세개짜리 forName을 쓰라는군요.

결국 forName()으로 클래스를 로딩할 떄는 별 개의 클래스로더를 쓰라는건데 그렇게 단순해 보이지가 않는데 클래스로더를 지정해 둔다고 해봤자. 보통 App CL로 읽어올테고 그럼 App CL 인스턴스를 버리라고?? 그건 좀..

forName으로 읽어올 클래스를 클래스패스를 가지고 있으면서 parent로 위임하지도 않는 CL을 이용해서 forName으로 읽은 경우라면 뭐 괜찮을지도 모르겠습니다. 어쨋거나 직접 통제가 가능한 클래스로더를 사용해야 겠네요.

'JAVA' 카테고리의 다른 글

[JAVA] ClassLoader  (0) 2017.10.30
[JAVA]classes 위치 가져오기  (0) 2017.10.30
[JAVA] class 클래스 로딩  (0) 2017.10.30
[JAVA] class 동적로딩  (0) 2017.10.30
[JAVA] class path에서 resource 찾기  (0) 2017.10.30
블로그 이미지

마크제이콥스

초보 개발자의 이슈및 공부 내용 정리 블로그 입니다.

,

[JAVA] class 클래스 로딩

JAVA 2017. 10. 30. 13:31

class 클래스 로딩


CLASSPATH에 없는 클래스 로딩


java.lang.reflect를 이용하면 우리가 원하는 클래스에 대한 invoke가 가능하다는 것은 알고 있을 것이다.

하지만 classpath에 등록안되어진 클래스들에 대해서는 어떻게 할 것인가?

일일이 사용자에게 클래스 패스를 설정하게 할수만은 없는 일 입니다.

보통의 엔진들을 보게 되면 install되어진 디렉토리의 위치만을 세팅하도록 하고 있다.

set JAVA_HOME 이라던지

set ANT_HOME 이라던지

쉘스크립트에 의하여 그러한 것들을 정의하여 java process를 띄우곤 하는데 그러면 내가 ant.jar등을 등록하지 않았음에도 불구하고 해당 애플리케이션들이 잘 작동하는 이유는 무엇일까요?

그건은 바로 ClassLoader에 숨겨져 있습니다.


아래에서 보여지는 샘플코드는 classpath 프로퍼티에 등록이 되어지지 않은 클래스들에 대한 조작을 할 것입니다. 

그렇게 함으로서 우리들이 만든 애플리케이션이 별다른 클래스로딩 정책 없이도 작동이 될수 있습니다.

그러려면 또한 잘 알아야 하는것이 reflection API가 있습니다.


이 부분에서는 그러한 것을 생략하고 URLClassLoader를 이용하여 디렉토리나 jar파일을 등록하여 가져오는 방법을 설명하도록 하겠습니다.


ClassLoader클래스는 이미 1.0API부터 존재했으며 URLClassLoader1.2에 새롭게 추가된 클래스이다.


우리가 사용하는 파일시스템이 URL이란 이름하에 조작이 될 수 있다는 것을 우선 명심해주시기 바랍니다.


이유는 file:// 이란 URI를 사용하기 때문이다.


아래에서는 특정한 티렉토리 안의 jar 파일에 대한 class loading샘플을 보여줍니다.


import java.io.*; 

import java.net.*; 


public class ClassLoading { 

public static void main(String [] args) throws Exception { 

   // Create a File object on the root of the directory containing the class file 

    File file = 

new File("D:/_Develop/jmxSamples/customMBean/log4j-1.2.8.jar"); 

     

    try { 

      // Convert File to a URL 

      URL url = file.toURL();          

// file:/D:/_Develop/jmxSamples/customMBean/log4j-1.2.8.jar 

            URL[] urls = new URL[]{ url }; 

            System.out.println(urls); 

       

            // Create a new class loader with the directory 

            ClassLoader cl = new URLClassLoader(urls); 

            System.out.println(cl); 

       

            // Load in the class; Logger.class should be located in 

     // the directory file:/D:/_Develop/jmxSamples/customMBean/log4j-1.2.8.jar 

      

Class cls = cl.loadClass("org.apache.log4j.Logger"); 

            System.out.println(cls); 

     

    } catch (MalformedURLException e) { 

        e.printStackTrace(); 

    } catch (ClassNotFoundException e2) { 

          e2.printStackTrace(); 

    }

   

  }

}


위에서 보는 것처럼 디렉토리를 설정하거나 특정 jar 파일을 사용할 수 있도록 작성합니다.

특정파일이 가르키지 않으면 해당 디렉토리의 class파일들을 package형태로 참조하도록 할 수 있는데 해당 디렉토리에 대한 클래스 로딩 샘플을 아래와 같습니다.


import java.io.*; 

import java.net.*; 


public class ClassLoading {

//Create a File object on the root of the directory containing the class file

File file = 

new File("D:/_CVSDevelop/jca_hello_adapter/build/classes");


try {

// Convert File to a URL

URL url = file.toURL();

// file:/D:/_CVSDevelop/jca_hello_adapter/build

URL[] urls = new URL[]{ url };

System.out.println(urls);


// Create a new class loader with the directory 

ClassLoader cl = new URLClassLoader(urls);

System.out.println(cl);


// Load in the class; Test.class should be located in 

// the directory //file:/D:/_CVSDevelop/jca_hello_adapter/build/classes/com/b//ea/jca/test/Test 

Class cls = cl.loadClass("com.bea.jca.test.Test"); 

System.out.println(cls); 

}catch (MalformedURLException e){

e.printStackTrace(); 

}catch (ClassNotFoundException e2){

e2.printStackTrace();

}

}


위와 같은 경우에는 classpath의 root로 잡은 디렉토리를 기준의 package형태로 설정되 파일을 로딩하여 사용할수 있도록 한다.

이 이후의 코딩에는 class가 newInstance를 취한 후 method를 

invoking해야 하는 과정을 거치게 되는데 한 가지 주의할 점은 해당 클래스를 반드시 reflection API를 이용하여 호출해야 한다는 점이다.

대략 아래의 코드정도를 이용하여 main 메소드등을 호출하는 클래스를 작성할 수 있을 것이다.


public void invokeClass(String name, String[] args)

throws ClassNotFoundException, NoSuchMethodException,

InvocationTargetException

{

Class c = loadClass(name);

Method m = c.getMethod("main", new Class[] {args.getClass()});

m.setAccessible(true);

int mods = m.getModifiers(); 

if(m.getReturnType() != void.class || !Modifier.isStatic(mods) || !Modifier.isPublic(mods)){

throw new NoSuchMethodException("main");

}

try {

m.invoke(null, new Object[] { args }); 

}catch (IllegalAccessException e) { 

// This should not happen, as we have disabled //access checks 

}

}


위와 같은 샘플을 이용하게 되면 서버측 프로그램에 대한 작성을 해볼 수 있는 좋은 기회가 아닐까 생각 됩니다.



'JAVA' 카테고리의 다른 글

[JAVA]classes 위치 가져오기  (0) 2017.10.30
[JAVA] Class.forName 사용하기  (0) 2017.10.30
[JAVA] class 동적로딩  (0) 2017.10.30
[JAVA] class path에서 resource 찾기  (0) 2017.10.30
[JAVA] cache function  (0) 2017.10.27
블로그 이미지

마크제이콥스

초보 개발자의 이슈및 공부 내용 정리 블로그 입니다.

,