JAVA関連のことを調べてみた2020年09月13日

JAVA関連のことを調べてみた2020年09月13日

【Kotlin】Java向けのリフレクションを利用したマッピングライブラリは基本的にKotlinで動かない

`ModelMapper`など、「`Java`向けのリフレクションを利用したマッピングライブラリが`Kotlin`の`data class`に対して機能しない」という話をしばしば見かけるので、何故そうなるのかと、それに対応するためにどのような手段が有るかを書きます。

# TL;DR
– `Java`向けのマッピングライブラリは「引数無しコンストラクタでインスタンス生成 -> 個々のフィールドを初期化」という手順を前提としている
– 一方、`Kotlin`の`data class`は基本的に引数無しコンストラクタを持たない
– このため、`Java`向けのリフレクションを利用したマッピングライブラリは`Kotlin`の`data class`に対して機能しない

## 補足
この記事では、マッピングライブラリという言葉を以下のような意味で使います。

– マッピングライブラリ: 何らかのソースからフィールドを初期化したオブジェクトインスタンスを生成するような機能を提供するライブラリ
– e.g. `ModelMapper`, `BeanPropertyRowMapper`

また、

元記事を表示

JavaのgetClass()はジェネリクス(or型変数)との相性が悪い

少し直観に反するJavaの言語仕様に気が付いたのでメモしておきます。
検証環境は Windows 版 OpenJDK 11 (build 28) です。

# 出来ないこと

“`java
public static void hoge(@NonNull T value){
Class type = value.getClass(); // コンパイルできない
// type を使って作業したい
}
“`

value は`T`かそのサブクラスのはずなので一見,問題なさそうな気がしますが,このコードはコンパイル出来ません.

“`text:javac
GenericGetClass.java:3: エラー: 不適合な型: ClassをClassに変換できません:
Class type = value.getClass();
^
Tが型変数の場合:

元記事を表示

Zipファイルを読み込み直接文字列に変換する

# 概要
Zipファイルを読み込み直接文字列に変換します。

# 解説
読み込みにはInputStreamクラスのreadAllBytesメソッドを使用しています。
すべてのバイトを一気に読み込んでくれるのでとても便利ですね~。

ただしリファレンスによると、「このメソッドが、すべてのバイトを1つのバイト配列に読み取ると都合が良い簡単なケースで使用するものであることに注意してください。 大量のデータを持つ入力ストリームを読み込むためのものではありません。」という記載がありました。

# コード
“`java:Unzip.java

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.util.zip.ZipInputStream;

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

String filePath = “ここでZipファイルのパスを指定”;

元記事を表示

正規表現で住所を番地前後で分割する

# 概要
javaで正規表現を使って、住所を番地前後で分割しようと思います。

コンソールから住所を入力することで分割された住所が表示されます。
※あくまで簡略的なものであり、全ての住所を完璧に分割できるものではないのでご了承ください。
# 手順
手順は以下の通りです
1.Patternクラス(java.util.regex.Pattern)で正規表現をコンパイル
2.Matcherクラス(java.util.regex.Matcher)のfindメソッドで入力された文字列が正規表現にマッチするか確認する。
3.マッチした場合文字を分割し、表示する。

正規表現の詳細はこちらのサイトを参考にいたしました。

【Javaで正規表現】文字列をチェックするパターンの書き方とサンプル

# コード
“`java:SplitAddress.java

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public

元記事を表示

Java学習方法~1番大変な最初の時期を乗り切る

###一番挫折しやすい最初の時期を乗り切るためのJavaの学習方法

今年の2月から本格的にプログラミング学習をはじめまして、
3月からJavaの学習をはじめました。

5月から業務系サービス開発のエンジニアとしてインターンをしていますが、
インターンまでは独学で勉強をしていました。

一番大変だった最初の時期を乗り切るために、おすすめだと思うJavaの勉強法を三段階で紹介します。

##①progate

軽くJavaの雰囲気掴む程度でいいと思います。
1~2周で十分です。
やっていて分からないことだらけだと思いますが、気にせず進めていけば問題ありません。

##②スッキリわかるJava入門
基礎・オブジェクト指向をもう少し学びたい時期にとても参考になった本です。
イラスト多めで分かりやすく、おすすめです。
基礎は大切です。Javaの基礎、オブジェクト指向の基礎を学びます。

実際に手を動かしながらの方がいいですが、全部は書かなくてもいいかなと思います。
文法の写経はやはり楽しくないです。
見返すこともできるので、一度に頑張りすぎなくてもいいです。

僕はこの時に実践編もやりました。

元記事を表示

Effective Java privateのコンストラクタでインスタンス化不可能を強制する

Effective Javaの独自解釈です。
第3版の項目4について、自分なりにコード書いたりして解釈してみました。
# 結論
staticメンバしか持たないクラスには、実行時例外を出すprivateコンストラクタを用意しよう。
# 説明
例えば共通の処理だけを集めたユーティリティクラス(以下、Utilクラス)はstaticメソッド、static変数のみを持ち、インスタンス化を前提としていない。

一般にpublicなUtilクラスは、コンストラクタを定義しないとpublicなデフォルトコンストラクタが用意されるため、外部のクラスで無駄にインスタンス化されてしまう懸念が生じる。

明示的にprivateコンストラクタを定義することで、Utilクラス外でのコンストラクタ呼び出しを防ぐことができる。
また、コンストラクタに例外出力処理を入れることで、Utilクラス内でのコンストラクタ呼び出しをエラーとすることができる。

※Utilクラスそもそもいらない論はここでは無視。
# コンストラクタ定義なしコード(ダメな例)
**Utilクラス**

“`java
public class S

元記事を表示

【Java】LocalDateTimeクラスで日付を取得する

#まずはimportが必要

“`java
import java.time.LocalDateTime;
“`
でパッケージの利用を宣言する必要があります。
**Eclipse**を使用している場合は宣言する前にLocalDateTimeのインスタンス化をすれば自動的にimport文が挿入されるようです。超便利ですね。

#現在の日付を取得してみよう

“`java
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; // 形式を指定する場合はこのパッケージ宣言が必要

public class Sample_01 {

public static void main(String[] args) {
LocalDateTime d = LocalDateTime.now(); // 現在時刻のインスタンスを取得
// LocalDateTime d = LocalDateTime.of(2016, 1, 1, 10. 10, 10); // 特定の日付のインスタンスを取

元記事を表示

Javaの診断ツール Arthas(アーサス)を使ってみた

# Arthas(アーサス)

Alibaba ArthasはJavaアプリケーションの監視、プロファイリングなどができるツールです。監視対象のアプリケーションの設定変更や再起動なしに利用できるのが特徴です。
Arthasではできることがたくさんあって、これまで一部の機能だけ使っていたのですが、改めて調べてみると様々なことができることが分かったので紹介がてらに触ってみたいと思います。

– [Arthas](https://github.com/alibaba/arthas)

# インストールと実行

Arthasのインストールと実行は以下のコマンドを実行するだけです(Linuxの場合)。
Arthas自体はjavaアプリケーションですので、他の環境でも動かすことができます。

“`
$ curl -O https://arthas.aliyun.com/arthas-boot.jar
$ java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.4.0
[INFO] Found existing java process,

元記事を表示

美大生のためのプログラミング入門:変数

※ Qiita では、本文部分のみの印刷に苦労します。そのため、同じ内容を以下のページにも掲載しています。プリンツアウトしたり PDF 化したい人は、こちらのページを利用して下しさい:

http://gurakura.sakura.ne.jp/hellomondrian/variable/

一覧はこちら:
http://gurakura.sakura.ne.jp/series/美大生のためのプログラミング入門/

Qiita 版の総合目次:
https://qiita.com/iigura/items/37180d127da93d0b8abb

![Vertical Composition with Blue and White](https://uploads3.wikiart.org/images/piet-mondrian/vertical-composition-with-blue-and-white-1936.jpg!Large.jpg)
Vertical Composition with Blue and White by Piet Mondrian, 193

元記事を表示

[ev3×Java] インテリジェントブロックボタン

この記事はJavaでev3を操作してみたい人のための記事です。
今回はインテリジェントブロックボタンを使っていろいろな操作をしていきたいと思います。

#目次
0 . 用意するもの
1 . Buttonクラスを使ったプログラム
2 . Keyインターフェースを使ったプログラム

#0.用意するもの
◯ ev3(タンク)
◯ パソコン(VSCode)
◯ bluetooth
◯ microSD
◯ [API Documentation](http://www.lejos.org/ev3/docs/overview-summary.html)(これをみながら進めていくのがオススメです。)

#1.Buttonクラスを使ったプログラム

####1-0 . 特定のボタンを押したら~するプログラム

◯上のボタンを押したら音がなり、右のボタンを押したらループを終了するプログラムです。

“`button00.java
import lejos.hardware.Button;
import lejos.hardware.Sound;

public class B

元記事を表示

【Java】 特定の数値を除いた乱数を取得する方法

綺麗なコードではない気がしますがこれからも使いそうなので備忘録用として載せました。

“`Java:main.java
import java.util.ArrayList;
import java.util.Random;

public class Main {

public static void main(String[] args) {
Random rand = new Random();
String i;
// 除外したい数値を格納する
List exList = new ArrayList();
exList.add(“2”);
exList.add(“5”);
exList.add(“8”);

do {
i = String.valueOf(rand.nextInt(10)+1); // 1~10までの乱数を生成し文字列に変換
} while (exList.contains(i)); //除外リストのいずれかの

元記事を表示

続:OOPのたとえ話が(略

# 熱いぜ
以前に[こんな記事](https://qiita.com/pff01632/items/bf4b58c92d6047ac2e67)を書いたのだが、久しぶりにOOPネタでトレンドが
~~炎上して~~ 熱く燃えているではないか。そこで、あれからまた少し考え
を整理した結果として、自分の考える抽象クラスとインタフェースは
こんな感じ!という考え方を表明してみたい。あくまでも自分の考えは
こうだ、という表明である。思考はJava的で。
※コードはビルドしてないし概念提示用のためかなり適当です。
# インタフェースとは
JavaのRunnableインタフェースがわかりやすいが、実装したい機能を表す
ハンドル(車のハンドルやバスケットの取手やドアノブのイメージ)だと
考えている。Runnableインタフェースで言うならば

– スレッドとして実装したいメソッドを表現するインタフェース
– スレッドの実装は要求ごとに異なるので好きに実装すればよい

という非常に便利な機能を提供してくれている。実装されているクラスが
何者かは知らなくても、インタフェースの機能は保証されると考えられる
ので

元記事を表示

【Java】配列とArrayListの違いについて

###初心者には同じにしか見えない…
**「Arrayってそもそも配列ですよね?ArrayListもArrayってあるから配列だよね!?」**

これは僕だけではないと思います。

使用していく中で経験的にわかっていくとは思いますが、ちゃんと理解していないと困ることもあるかと。

自分なりの理解をメモしておきますので、初心者の方に対して少し違いがイメージできるようになる助けになればと思います。

###そもそもクラスって?

* クラス
* データ(変数)
* 処理(メソッド・関数)

要は**データと処理を一まとまりにして扱うよ**というもの。

これが最初はわからなかったし、今でもそんなに便利なものなのかどうかもよくわかっていませんが。。。

よく車とかで説明されたりしますが、結局**「言ってることはわかるけど。。。」**という消化不良状態でした。

しかし、結局は**テンプレ**だと考えればすっきりしました。

###クラスはテンプレ、インスタンス化はテンプレの利用

初心者にはクラスとかインスタンス化しないと使えないとか言われてもなんのこっちゃという感じ

元記事を表示

JNIのライブラリ導入時にハマった事象

# はじめに
現在参画している案件でJNIの外部ライブラリを導入する際にClassLoader問題にハマったため、備忘録として解決方法を残したいと思います。

# 環境
Java8
wildfly-8.1.0.Final

# JNIとは
Java Native Interface (JNI) は、Javaプラットフォームにおいて、Javaで記述されたプログラムと、他のプログラミング言語(たとえばCやC++など)で書かれた、実際のCPU上で動作するコード(ネイティブコード)とを連携するためのインタフェース仕様である。
(Wikipedia:https://ja.wikipedia.org/wiki/Java_Native_Interface より引用)

# 導入ライブラリについて
メイン処理がC++で実装された外部ライブラリで、JNIを利用してJavaに組み込もうとしていました。

# ハマった点
ビルド資材を作成した際に以下のような構成にしていました。

“`terminal
service.ear
 ├ lib
 │ └ jni.jar ← ここにJNIのjarを配置
 ├ M

元記事を表示

Webアプリ開発の記事まとめ

#はじめに
DreamHanksの松下です。新規でWebアプリの開発を行いました。
こちらの記事は、その記事のまとめです。

#連載記事まとめ
[【第一回】Spring-MVCフレームワークのプロジェクトの作り方](https://qiita.com/DreamHanks/items/a148d9b96343f7a535d1)

【作成予定記事】
・mybatisのインストール方法
・myBatisジェネレータでオブジェクトを作る

#補足記事

【作成予定記事】
・get,postの違い
・mavenでのmybatis実行方法
・maven(ビルドツール)の解説
・xmlファイルの解説

元記事を表示

【第一回】Spring-MVCフレームワークのプロジェクトの作り方

#はじめに
DreamHanksの松下です。今回はSpring-MVCフレームワークのプロジェクト作成の手順を解説していきます。

今回のWebアプリ開発ではDBアクセスのフレームワークはMyBatisを使用します。

[連載記事まとめ](https://qiita.com/DreamHanks/items/7df703a509ef22f64d2c)

#インストールするもの解説
###ツール・環境関係
 下記のものを用意する。
 ・eclipse2020
 ・jdk:1.8
 ・tomcat:8.5
 ・mysql:8.
 ・A5SQL

###eclipseでダウンロードするもの
 下記のものはeclipse→ヘルプ→マーケットプレイスからダウンロード
 ・Spring4
 ・Spring Tools 3 Add-On for Spring Tools 4

#新規プロジェクトの作り方
①新規プロジェクトを選択

②Springと検索→「Springレガシー・プロジェクト」を選択→次へ
 
![無題.png](https://qiita-image-store.s3.ap-no

元記事を表示

【AWS x Java】DynamoDB StreamsをKinesis Client Library (KCL) で処理する

# はじめに
実案件でDynamoDB StreamsをKinesis Client Library (以下KCL) で処理する機会がありましたので、KCLが実際にどういう挙動をするのか、それを踏まえてどのような実装にしたのか紹介したいと思います。

![3c1c3976-0a28-5cb8-3eab-b1ec4ac37f5c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555899/ed41f64b-0e36-118b-0af9-cdbe54f05325.png)

## 今回やりたかったこと
[BookLive!](https://booklive.jp/)のある機能ではDynamoDBを使用しています。
このDynamoDBのデータを、データ追加後できるだけ早いタイミングでRedshiftに転送する必要が出てきました。
現状のテーブル形式を踏まえ様々な検討をした結果、DynamoDB Streamsを設定し、追加されていくデータをいわゆるストリームとして扱うことでRedshiftに持っていくこ

元記事を表示

【Java】日付の期間重複チェックサンプル

# 概要
日付で期間を持ってるデータを登録するときにすでに登録してある期間と重複しないようにしたい。
LocalDateを使ったJavaのサンプルがあまり見当たらなかったので公開します。

# 環境
– Java 1.8
– SpringBoot 2.2.1.RELEASE
– thymeleaf 3.0.11.RELEASE

# 期間が重複するパターン
日付の期間が重複するパターンは全部で4つ。
![Qiita用画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265229/f75d6dcf-99ee-6348-7c16-33354dc2cd73.png)
1. 前半がかぶるパターン(①の終了日と緑の開始日が同じも含む)
2. 後半がかぶるパターン(②の開始日と緑の終了日が同じも含む)
3. 全部かぶるパターン(開始日と終了日が全く同じも含む)
4. 一部がかぶるパターン

全パターンを網羅できる条件式は下記の通り。

“`java:条件式
緑.開始日 <= 黒.終了日 && 緑.終了日 =>

元記事を表示

@Slf4j など外部ロギングAPIを用いている時にログの出力のロガーの挙動をテストする

# 背景
@Slf4j など外部ロギングAPIを用いている時にログの出力のログをテスト時に確認したい。

# 目的
ログをモック化してログの出力をテストコードで制御できるようにする

コードをざっと確認したい人は”[サンプルコード](https://qiita.com/yusha3/items/c9576bbe8b6cc5b27897#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89)”の章で確認できます。

# アプローチ
手順の流れ
1. ArgmentCaptor の定義
2. 対象のクラスのLoggerを定義し、モックのアペンダーをいれる
3. ロガーモックインスタンス指定のコールをキャッチする。

## 1. ArgmentCaptor の定義

“` java
@Captor
private ArgumentCaptor captorLoggingEvent;
“`

ArgmentCaptor はmockito のクラスでスタブ化したメソッドがちゃんと呼

元記事を表示

JavaにおけるfinalとImmutableの違い

#JavaにおけるfinalとImmutableの違いって?

最近GuavaのImmutable Listを使う機会があったのですが、ふとImmutableとfinalの違いってなんだ?と疑問になって調べてみました。

##Immutableの特徴
・オブジェクトの値そのものを変更することを禁止
・参照先を変更することは可能

##finalの特長
・参照先の変更をすることを禁止
・変数の値そのものを変更することは可能

では、JavaではImmutableで代表的なStringとMutableなStringBuilderを使って検証してみます。

“`Java
class Main
{
public static void main (String[] args) throws java.lang.Exception
{
final String str = “apple”;
final StringBuilder sb= new StringBuilder(“ringo”);

str = str + “ringo”; //コンパイルエラー。Strin

元記事を表示

OTHERカテゴリの最新記事