プログラミング自主学習 DAY64 java.base/Reflection
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+"초 ");
}
}
오전 4시 52분 10초 //午前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