📚

プログラミング自主学習 DAY64 java.base/Reflection

2023/07/30に公開

java.util

Date

現在時点の時間を記録しているクラス。

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateExample {

public static void main(String[] args) {
	Date now = new Date();
	String strNow1 = now.toString();
	System.out.println(strNow1);
        //toString -> Return English 
		
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd.HH:mm:ss");
	String strNow2 = sdf.format(now);
	System.out.println(strNow2);
    }//main() end
}//class() end

Calendar

現在時間

Dateより時間計算に対して様々な機能がある抽象クラスだ。
抽象クラスは、new 演算子通して、オブジェクトを生成ないため、getInstance()メソッドを活用し、Calendarを継承したサブクラス(ロカールクラス)のオブジェクトをリターンする。

Calnder : public abstract class Calendar
抽象クラスだ。

protected Calendar()
Constructs a Calendar with the default time zone and the default FORMAT locale.
protected Calendar(TimeZone zone, Locale aLocale)
Constructs a calendar with the specified time zone and locale.

また、抽象クラスのコンストラクタは、protectedに設定されていることが分かる。

import java.util.Calendar;

public class CalendarExample {

public static void main(String[] args) {
	Calendar now = Calendar.getInstance();
		
	int year = now.get(Calendar.YEAR);
	int month = now.get(Calendar.MONTH)+1;
	int day = now.get(Calendar.DAY_OF_MONTH);
	int week = now.get(Calendar.DAY_OF_WEEK);
	String strWeek = null;
	
	switch(week) {
	case Calendar.MONDAY:    strWeek = "월"; break;
	case Calendar.TUESDAY:   strWeek = "화"; break;
	case Calendar.WEDNESDAY: strWeek = "수"; break;
	case Calendar.THURSDAY:  strWeek = "목"; break;
	case Calendar.FRIDAY:    strWeek = "금"; break;
	case Calendar.SATURDAY:  strWeek = "토"; break;
	default :                strWeek = "일"; 
	}

	int amPm = now.get(Calendar.AM_PM);
	String strAmPm = null;
	if(amPm == Calendar.AM) {
		strAmPm = "오전";
	}else {
		strAmPm = "오후";
	}
		
	int hour = now.get(Calendar.HOUR);
	int minute = now.get(Calendar.MINUTE);
	int second = now.get(Calendar.SECOND);
		
	System.out.print(year+"년 ");
	System.out.print(month+"월 ");
	System.out.println(day+"일 ");
	System.out.print(strWeek+"요일 ");
	System.out.println(strAmPm);
	System.out.print(hour+"시 ");
	System.out.print(minute+"분 ");
	System.out.println(second+"초 ");
		
	}

   }
2023년 7월 30일 
일요일 오전
11시 32분 13초 

国際時間のID(key)を得る

先ほどは、自分がいる場所の現在時間帯を把握してみた。
次は、TimeZoneクラスのオブジェクトを通して、特定地域の時間を調べてみる。

TimeZoneクラスのオブジェクトを生成するまえ、まずパラメータに入れたい地域、国家のIDが必要だ。このような値をIDには何かあるか探してみる。

import java.util.TimeZone;

public class PrintTimeZoneID {
	public static void main(String[] args) {
		String[] availableIds = TimeZone.getAvailableIDs();
		for(String id : availableIds) {
			System.out.println(id);
		}
	}
}
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
.
.
Europe/Madrid
.
.
.

様々な国と地域のIDをゲットできた。
次は、スペインの時間帯をゲットするため、Europe/Madridを使用してみる。

TimeZoneを通して国際時間をゲット

import java.util.Calendar;
import java.util.TimeZone;

public class MadridExample {

public static void main(String[] args) {
        TimeZone timezone = TimeZone.getTimeZone("Europe/Madrid");
	Calendar now = Calendar.getInstance(timezone);
	
	int amPm = now.get(Calendar.AM_PM);
	String strAmPm = null;
	if(amPm == Calendar.AM) {
		strAmPm = "오전";
	}else {
		strAmPm = "오후";
	}
	
	int hour = now.get(Calendar.HOUR);
	int minute = now.get(Calendar.MINUTE);
	int second = now.get(Calendar.SECOND);
	
	System.out.print(strAmPm + " ");
	System.out.print(hour+"시 ");
	System.out.print(minute+"분 ");
	System.out.println(second+"초 ");
	
	}
}


오전 45210//午前4時52分10秒


java.time

LocalDataTime

現在、時間を把握するのみならず、時間の計算もできるクラスだ。
同じパッケージ内にあるクラスDateTimeFormatterとよく活用される。

時間の操作

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class DateTimeOperationExample {

public static void main(String[] args) {
		
  LocalDateTime now = LocalDateTime.now(); //公開されているコンストラクタなし
  DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy.MM.dd a HH:mm:ss");
  System.out.println("현재 시간: " + now.format(dtf));
		
  LocalDateTime result1 = now.plusHours(1);
  System.out.println("한 시간 후: " + result1.format(dtf) );
		
  LocalDateTime result2 = now.minusMonths(2);
  System.out.println("두 달 전: " + result2.format(dtf));
		
  LocalDateTime result3 = now.plusDays(7);
  System.out.println("7일 후: " + result3.format(dtf));
   }
}
현재 시간: 2023.07.30 오후 12:13:23  
한 시간 후: 2023.07.30 오후 13:13:23
두 달 전: 2023.05.30 오후 12:13:23
7일 후: 2023.08.06 오후 12:13:23

時間の比較

LocalDateTime , time.format.DateTimeFormatter, time.tempolar.ChronoUnitを活用する。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;


public class DateTimeCompareExample {
public static void main(String[] args) {


DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy.MM.dd a HH:mm:ss");
		
LocalDateTime startDateTime = LocalDateTime.of(2023, 1, 1 , 0, 0, 0);
System.out.println("시작일:" + startDateTime.format(dtf));
		
LocalDateTime endDateTime = LocalDateTime.of(2023,12,31,0,0,0);
System.out.println("종료일:" + endDateTime.format(dtf));

	if(startDateTime.isBefore(endDateTime)) {
		System.out.println("진행 중입니다.");
	}
	else if(startDateTime.equals(endDateTime)) {
		System.out.println("종료합니다.");
	}
	else if(startDateTime.isAfter(endDateTime)) {
		System.out.println("종료했습니다.");
	}
		
long remainYear = startDateTime.until(endDateTime,ChronoUnit.YEARS);
long remainMonth = startDateTime.until(endDateTime, ChronoUnit.MONTHS);
long remainDay = startDateTime.until(endDateTime, ChronoUnit.MONTHS);
long remainHour = startDateTime.until(endDateTime, ChronoUnit.HOURS);
long remainMinute = startDateTime.until(endDateTime, ChronoUnit.MINUTES);
long remainSecond = startDateTime.until(endDateTime, ChronoUnit.SECONDS);
		
System.out.println("남은 해: " + remainYear);
System.out.println("남은 달: " + remainMonth);
System.out.println("남은 일: " + remainDay);
System.out.println("남은 시간: " + remainHour);
System.out.println("남은 분: " + remainMinute);
System.out.println("남은 초: " + remainSecond);
}//main
	
}//class
시작일:2023.01.01 오전 00:00:00   
종료일:2023.12.31 오전 00:00:00
진행 중입니다.
남은 해: 0
남은 달: 11
남은 일: 11
남은 시간: 8736
남은 분: 524160
남은 초: 31449600```

java.text

DecimalFormat(int to String)

数字を指定した形の文字列に変換する。

\u00A4 : ₩
その以外、0, #などの記号で表現することが可能だ。

import java.text.DecimalFormat;

public class DecimalFormatExample {
	public static void main(String[] args) {
	  double num = 1234567.89;
		
	  DecimalFormat df;
	  
	  //정수 자리까지 표기
	  df = new DecimalFormat("#,###");
	  System.out.println(df.format(num));
		
	  //무조건 소수 첫째 자리까지 표기
	  df = new DecimalFormat("\u00A4#,###.0");
	  System.out.println(df.format(num));
	  
		
	}

}
1,234,568
₩1,234,567.9

SimpleDateformat(int to String)

日日を指定した形の文字列に変換する。

import java.text.SimpleDateFormat;
import java.util.Date;


public class SimpleDateFormatExample {

public static void main(String[] args) {
	Date now = new Date();
		
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
	System.out.println(sdf.format(now));
		
	sdf = new SimpleDateFormat("yyyy년 MM월 dd일");
	System.out.println(sdf.format(now));
		
	sdf = new SimpleDateFormat("yyyy.MM.dd a HH:mm:ss");
	System.out.println(sdf.format(now));
		
	sdf = new SimpleDateFormat("오늘은 E요일");
	System.out.println(sdf.format(now));
		
	sdf = new SimpleDateFormat("올해의 D번째 날");
	System.out.println(sdf.format(now));
		
	sdf = new SimpleDateFormat("이 달의 d번째 날");
	System.out.println(sdf.format(now));
		
	}

}

2023-07-30
2023년 07월 30일
2023.07.30 오후 16:08:24
오늘은 일요일
올해의 211번째 날
이 달의 30번째 날

java.util.regex

Pattern

二つの文字列(パターンと値)が形にあってるかをチェックし、booleanでリータンする。
static method pattern(regex, str)でnew 演算子を使用せず、リータンすることができる。

import java.util.regex.Pattern;

public class PatternExample {

	public static void main(String[] args) {
		String RegExp = "(02|010)-\\d{3,4}-\\d{4}";
		String data = "010-123-4567";
		boolean result = Pattern.matches(RegExp, data);
		System.out.println(result);
		if(result) {
			System.out.println("정규식과 일치합니다.");
		}else {
			System.out.println("정규식과 일치하지 않습니다.");
		}
		
		
		RegExp = "\\w+@\\w+\\.\\w+(\\.\\w+)?";
		data = "angel@mycompanycom";
		result = Pattern.matches(RegExp, data);
		System.out.println(result);
		if(result) {
			System.out.println("정규식과 일치합니다.");
		}else {
			System.out.println("정규식과 일치하지 않습니다.");
		}
		
		
	}

}

true
정규식과 일치합니다.
false
정규식과 일치하지 않습니다.

リフレクション(Reflection)

メタ情報:データーに対してのデーター。ここでのメタ情報は、パッケージ情報、タイプ情報、メンバー(コンストラクタ、フィールド、メソッド)情報を意味する。

メタ情報は Class というclassのオブジェクトで管理し、このメタ情報をプログラムで読み、修正することをReflectionという。

クラス情報

Class classInfo = String.class;

Class classInfo = Class.forName("java.lang.String");

String str = "감자바";
Class classInfo = str.getClass();

パッケージ&タイプ情報

public class GetClassExample {

public static void main(String[] args) {
	//how1
	Class classInfo = Car.class;
		
	//how2
	//Class classInfo = Class.forName("ch12.sec11.exam01.Car);
		
	//how3
	//Car car = new Car();
	//Class classInfo = car.getClass();
		
	System.out.println("클래스 간단 이름: " + classInfo.getSimpleName());
	System.out.println("패키지 이름: " + classInfo.getPackageName());
	System.out.println("클래스 전체 이름: " + classInfo.getName());

	}
   }

클래스 간단 이름: Car
패키지 이름: ch12.sec11.exam01
클래스 전체 이름: ch12.sec11.exam01.Car

メンバー情報


import java.lang.reflect.*;

public class ReflectionExample {

public static void main(String[] args) throws Exception{
	Class classInfo = Car.class;
		
	System.out.println("[Constructor]");
	Constructor[] constructors = classInfo.getDeclaredConstructors();
	for(Constructor constructor : constructors ) {
		System.out.print(constructor.getName()+ "(");
		Class[] parameters = constructor.getParameterTypes();
		printParameters(parameters);
		System.out.println(")");
	     }
	System.out.println();
		
		
	System.out.println("[Field]");
	Field[] fields = classInfo.getDeclaredFields();
	for(Field field : fields) {
	     System.out.println(field.getType().getName()+" " + field.getName());
	    }
	System.out.println();
		
	System.out.println("[Method]");
	Method[] methods = classInfo.getDeclaredMethods();
	for(Method method : methods) {
		System.out.print(method.getName() + "(");
		Class[] parameters = method.getParameterTypes();
		printParameters(parameters);
		System.out.println(")");
	}
     }//main end
	
private static void printParameters(Class[] parameters) {
 for(int i =0; i<parameters.length; i++) {
	System.out.print(parameters[i].getName());
	if(i<(parameters.length-1)) {
		System.out.print(",");
	}
     }
 }
}//class end

[Constructor]
ch12.sec11.exam02.Car()
ch12.sec11.exam02.Car(java.lang.String,java.lang.String)

[Field]
java.lang.String model
java.lang.String owner

[Method]
getOwner()
setOwner(java.lang.String)
setModel(java.lang.String)
getModel()

リソースの絶対パス

Class オブジェクトのgetResource(String name).getPath()メソッドを通して、絶対パスを得ることができる。メソッドを呼び出すクラスを基準にのgetResource(String name)のパラメータには、リソースの相対経路を入れ、getPath()を追加する。

public class GetResourceExample {

public static void main(String[] args) {
	Class classInfo = Car.class;
		
	String photo1Path = classInfo.getResource("photo1.jpg").getPath();
	String photo2Path = classInfo.getResource("images/photo2.jpg").getPath();
		
	System.out.println(photo1Path);
	System.out.println(photo2Path);

	}

}
/C:/Users/gram/Desktop/programming/Thisisjava/thisisjava/bin/ch12/sec11/exam03/photo1.jpg
/C:/Users/gram/Desktop/programming/Thisisjava/thisisjava/bin/ch12/sec11/exam03/images/photo2.jpg

Discussion