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

JAVA関連のことを調べてみた2020年10月11日
目次

Spring WebFluxで自作WebFilterなどでServerHttpRequestからJSONボディを読み込むショートハンド

Spring Boot 2.3.4.RELEASE時点の環境の話です。

Spring WebFluxではHTTPリクエストを処理するための方法を幾つか提供してくれている。

この時にHTTPレスポンスデータを生成するために、
多くの場合は`RouterFunction`や`@Controller`を使用することが多いと思う。

`RouterFunction`には`ServerRequest`が渡されるので、`ServerRequest#bodyToMono(Class)`を呼び出しすれば
リクエストボディのJSONデータをパース出来る。

Spring Bootでは`@Controller`の場合は`@RequestBody`アノテーションが付与されていれば
フレームワーク側でリクエストボディをパースしてくれる。

ほとんどの場合はこの方法でリクエストボディのJSONをアプリケーション内で利用するオブジェクトに変換できる。

しかし、Spring Securityのカスタム認証はWebFilterの段階で処理を行うため、
`RouterFunct

元記事を表示

javaのラムダ式[メモ書き]

java8から使用できるラムダ式を試してみました。

“`java:demojava/demo9/Demo9.java
package demojava.demo9;

interface Rtest{
public String Res(Integer x,Integer y );
}

public class Demo9 {

public static void main(String [] args) {

Rtest rtest = (x,y)->{
return “(” + x + “,”+ y + “)\n\n”;
};

System.out.println(rtest.Res(10,20));
}

}

“`

実行結果
![2020-10-11_07-08-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779064/23e99444-4686-eae0-0b58-79d74461d0ce.png)

元記事を表示

難読化されたメソッド名を特定する

Androidアプリを難読化して動かすと、例外が発生することがあります。
スタックトレースを見ても難読化により、どのメソッドで例外が発生したのかわかりません。
そんなとき、例外発生したメソッドを特定する方法です。

# 難読化
Androidでは、セキュリティやサイズ縮小を目的に以下の設定を行うことがあります。

“`groovy:build.gradle
minifyEnabled true
shrinkResources true
“`

この設定で動かしてみると、例外が発生することがあります。

# 難読化で例外発生して困ること

以下の実装があるとします。

“`java:Calc.java
package com.example.myapplication;

public class Calc {
public int divide(int param1, int param2) {
return param1 / param2;
}
}
“`

“`java:MainActivity.java
package com.exampl

元記事を表示

SpringBootを0〜100までやってみる。

【業務で使用することになり勉強を始めました。全くの素人であるし間違っていることが多いです。随時更新。】

その1「Springbootでindex.html表示」

 ・MVCモデルを使っている。
 ・STSで実施。
 ・パッケージエクスプローラのspringスタータープロジェクト作成。
 ・依存関係でSpringBootDevToolsとspringwebとThymeleafを選択
 ・src/main/javaにパッケージが作られデフォルトでapplication.javaが作られる。
  application.javaにはmainが入っているので、実行はここから
 ・controllerはパッケージに置く
 ・viewはsrc/main/resources/templateに置く。

まずはcontroller
こいつはコントローラだよってことで@Controllerを書く
コンテキストルート(http://localhost:0808/) に接続したいというリクエスト対して @RequestMappingというアノテーショ

元記事を表示

文字列を一文字ずつ表示[メモ書き]

1文字ずつ表示させる。

“`java:demojava/demo8/Demo8.java
package demojava.demo8;

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

String s = “TENET”;
for(int i = 0 ; i < s.length();i++){ System.out.println( (i + 1) + "文字目 = " + s.charAt(i)); } for(int i = ( s.length() - 1); i >=0 ;i–){
System.out.println( (i + 1) + “文字目 = ” + s.charAt(i));
}

}

}
“`

![2020-10-10_21-19-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779064/6dc07c52-1ef7-b09a-7202

元記事を表示

javaのメモ

随時追記

BufferReeader

“`
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine())

// スペースで分割される
String[] str = line.split(” “);
“`

キャスト

“`
//string->int
int i = Integer.parseInt(str); 
“`

Scanner

“`
Scanner scanner = new Scanner(System.in);
“`

元記事を表示

java浮動小数点の取り扱い参考書を読みながら[メモ書き]

0.7 + 0.1 = 0.8だけどコンピューターに計算させると誤差が出る話。
どうして出るかは割愛(**下記参照**)。
https://www.php.net/manual/ja/language.types.float.php

参考書では**BigDecimal**を使用して対処している。

“`java:demojava/demo5/Demo5.java
package demojava.demo5;

import java.math.BigDecimal;

public class Demo5 {
public static void main(String [] args) {
double test1 = 0.0;
test1 = 0.7 + 0.1;
System.out.println(“test1 = ” + test1);

test2();
}
public static void test2() {
BigDecimal val1 = new BigDecimal(“0.7”);
BigDecimal val2 = new

元記事を表示

【Java】already in use の対処法

## already in use
portすでに使ってるよExceptionが出た時の確認コマンド。
よく忘れるから備忘録として書いておく。

今回はエラー文に「8080が使用中やで〜」と書いてあったので「8080」を閉じる想定です。

## コマンド

“`
$ sudo lsof -i:8080
“`

上記コマンドを打つと、

“`
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
“`
こんな感じのリストが表示されるので、PIDを使って下記コマンドでportを閉じる。

“`
$ sudo kill #{PID}
“`

もう一度 `lsof` コマンドを打つと何も表示されないので、
ポートが閉じたことを確認することができる。

## まとめ
使用したポートは使い終わったら閉じないと後々めんどくさい……(自戒)

元記事を表示

業務用のシステムにおいてクラス設計(分割)をどのように考えるか(1)

まだ模索中のテーマですが、一旦の方針が固まって成果も得られてきたので書き下します。
知っている人には「当たり前だろ」となるので、記事をスキップしてください。若手〜中堅向けの内容です。
議論により、さらに磨いていけたらと思います。

# 前提
1. Javaアプリ(C#でもいい。オブジェクト指向の言語なら)
1. BtoC、BtoBに関わらず、業務系のシステムを対象
1. WebAPIなども含みます。 要はJavaバッチなどは対象外。
1. プロジェクトチームのプログラミングスキルはそこまで高くない。
1. 多重下請けの弊害で、コストは一人前なのにスキルの伴っていないSE(最早コーダー)が多数いるようなチームを想定していただければ。

# 考慮すべきポイント
1. ビジネスの変化に(要件の変更・追加・削除)に柔軟に対応する構成にしたい。
2. 今後も継続的に改修されていくが、メンバーが入れ替わる可能性が高いため、可読性を大事にしたい。
3. プロジェクトメンバーのスキルに期待できないため、あまり難しい理論とかは入れたくない。(DDDとかは嫌だ)

こんなところでしょうか。

元記事を表示

【Java Silver】(例外処理)try-catch-finally文とtry-with-resource文について

#try-catch-finally文とtry-with-resource文
どちらも例外処理を記述するための構文。

##**※例外処理とは**
Javaの例外には、Error、Exception(検査例外)、RuntimeException(非検査例外)がある。

・**Error**はプログラムでは対処できない問題(※**コンパイルエラーとは異なり**、あくまで**例外**)
・**Exception(検査例外)**は、例外発生時の処理を記述しないとコンパイルエラーが発生する問題
・**RuntimeException(非検査例外)**は、例外発生時の処理が任意の例外。
 Exceptionのサブクラスなので、先にExceptionをキャッチするcatchブロックを書いたあとで、RuntimeExceptionをキャッチするcatchブロックを書くと、到達不能コードとなりコンパイルエラーが発生する

##メソッドに例外を無視させる・メソッドから例外を発生させる

・**throws** : メソッド内で該当の例外が発生した場合、自信のメソッド内でcatchするのではなく、呼ばれる

元記事を表示

【Java Silver】ラムダ式に関するポイントまとめ

#ラムダ式とは
実装が必要なメソッドを1つだけ持つインターフェース型変数に、実行したいコードを代入する仕組み。

#関数型インターフェースとは
関数型インターフェースは、**実装が必要なメソッド**を**1つ**だけ持つインターフェースのこと。
入力に対して出力が1つに決まるから「関数型」と呼ばれる。

#関数型インターフェースの種類

|インターフェースの種類 |実装が必要なメソッド | 特徴   
|—|—|—|—|
| Consumer\ | void accept(T) |引数を受け取って処理する。結果を戻さない、引数の**消費者**
| Supplier\ |T get() |何も受け取らずに結果だけを戻す**供給者**
| Predicate\ |boolean test(T) |引数を受け取って、それを評価する**断定者**
|Function\ |R apply(T) |引数を受け取って、指定された型(R)の結果を戻す**処理者**

※\とは:TはTypeの略。何型でも良い、ということ

元記事を表示

Reladomo の MT Loader(Multi-Threaded Matcher Loader)を使ってみる

# はじめに
[以前書いた記事](https://qiita.com/Amtkxa/items/846af2e6a780112179a9) の続きで、今回は Reladomo の MT Loader を使ってみたお話です。

# MT Loader(Multi-Threaded Matcher Loader)とは?

Multi-Threaded matcher Loader (MT Loader) は、別のソース(file, feed, other DB, etc.)からの変更を出力先のDBにマージするための機能です。ドキュメントを読んだ感じだと、Reladomo で扱うデータ量が多い場合に MT Loader が推奨されることが多いです。

## MT Loader の動作イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179364/c3f71977-82ac-a238-1e79-e8c93ccfffaf.png)

– Input と Output(Database) の2

元記事を表示

vscodeのjavaデバッグ時にパラメーターを渡す。[メモ書き]

vscodeのjavaデバッグ時にパラメーターを渡す。[メモ書き]
java言語に限らずだけども、vscodeのデバッグ設定ファイルに下記の項目を追加する(**※args**)。

“`:launch.json
{
“type”: “java”,
“name”: “Debug (Launch) – Current File”,
“request”: “launch”,
“mainClass”: “${file}”,
“args”: [
“あいうえお”,
“カキクケコ”
]
},
“`

下記で試す

“`java:demojava/demo4/Parameter.java
package demojava.demo4;

public class Parameter {
public static void main(String[] args) {
System.out.println(args[0] + “::” + args[1] );
}
}
“`
試した結果
![2020-10-10_14-30-2

元記事を表示

javaを使用してスクレイピングを試す[メモ書き]

##試したこと
Yahoo NewsのIT記事を取得。
***
###メモ書き
***
jdk14.0.1
jsoup-1.13.1.jar
***
vscodeの環境設定が出来ていなかったので最初、jsoupが読み込まれず、エラー。
下記のファイルに設定を行って対応。

“`:settings.json
“java.project.referencedLibraries”: [
“lib/**/*.jar”,
“C:\\パス\\jsoup-1.13.1.jar”
],
“`

“`java:demojava/demo3/Web.java
package demojava.demo3;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;

public class Web {
pu

元記事を表示

【Java Silver】アクセス修飾子のポイントまとめ

#アクセス修飾子

|アクセス修飾子 |アクセス可能 |クラス図での記号   
|—|—|—|—|
|public |どこからでも |+
|protected |同一パッケージのクラスとサブクラス |#
| |同一パッケージのクラス |~
|private|現在のクラス |-

許可されていない箇所からのアクセスは**コンパイルエラー**となる

#アクセス修飾子を考慮する必要があるもの
・**クラス**(別パッケージからアクセス可能か判断するため)
・メソッド
・コレクション(配列、ArrayList)
・フィールド

#アクセス修飾子の注意点

##インターフェースとアクセス修飾子

インターフェースは**継承される前提**のものなので、インターフェース自体は暗黙的に**publicとみなされる**
→ インターフェースに定義できるメソッド 
  ・**抽象メソッド**の場合、暗黙的に**public**、abstractであると解釈される(public、abstractは省略可)
  ・**実装を持つ**場合、**stati

元記事を表示

【JMH】JMH Gradle PluginでFAILURE: Build failed with an exception. A failure occurred while executing me.champeau.gradle.IsolatedRunnerと言われた場合の対処【Gradle】

`JMH Gradle Plugin`(`me.champeau.gradle.jmh`)で、以下のようなエラーが出る状況への対処法です。

“`bash
> Task :jmh FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ‘:jmh’.
> A failure occurred while executing me.champeau.gradle.IsolatedRunner
> Error during execution of benchmarks
“`

自分の場合、ベンチマーク関連のディレクトリ構成が原因でした。

[プラグインのREADMEに記載されている](https://github.com/melix/jmh-gradle-plugin#configuration)通り、`JMH Gradle Plugin`では`src/jmh`配下にベンチマークが有ることを想定しています。
このため、どこにベンチマークが有るかを

元記事を表示

【JMH】JMH Gradle PluginでExecution failed for task ‘:jmhRunBytecodeGenerator’. java.lang.NullPointerException…となって実行が失敗する場合の対処【Gradle】

`JMH Gradle Plugin`(`me.champeau.gradle.jmh`)で、以下のようなスタックトレースが出て実行が失敗する場合への対処法です。

“`bash
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ‘:jmhRunBytecodeGenerator’.
> A failure occurred while executing me.champeau.gradle.JmhBytecodeGeneratorRunnable
> Generation of JMH bytecode failed with 1 errors:
– Annotation generator had thrown the exception.
java.lang.NullPointerException

“`

自分は以下の`build.gradle.kts`でプロジェクトをやっていましたが、`grou

元記事を表示

【Java Silver】配列の生成方法

#配列の特徴

– 配列は**nullを許容**する
– 配列の要素数は、初期化された時に決まり、後から変更できない(要素の**追加・削除不可**。上書きは可能)
– 配列はオブジェクトクラスのサブクラスなので、**オブジェクト型**とみなすことができる

例)

“`java
example(Object[] val); //引数にオブジェクト型の配列を受けとる

example(Object val) //引数に配列を受け取ることができる
“`

#配列の生成方法
**【注意するポイント】**

– 変数宣言時に大かっこ[]があるか → []無し、または[]以外のカッコを使っていたら**コンパイルエラー**
– 変数宣言時に要素数を指定していないか → **変数宣言時**に**要素数を指定**していたら**コンパイルエラー**
– **インスタンスの生成時**に**要素数を指定**しているか
– **インスタンスの生成**で**newを記述**しているか

**※) new省略し、初期化子( {} )だけで配列を作ることは可能!!**
– 初期化子で指定した要素の数だけ

元記事を表示

【Android / Java】表示Fragmentによりイベントを切り替える

# はじめに
Android Studio(java)でアプリを開発していて、「表示しているフラグメントに応じて端末の戻るボタンを押した時の処理を切り替える」という実装をしたい場面があった。
そのときに学んだ内容を投稿します。

# 学んだ内容
コードの一部を記載

## ActivityからFragmentを表示

このアクティビティxmlファイルにフラグメントを表示させる

“`activity_main.xml

Doma入門 – Criteria API チートシート

## 前提

[Doma](https://github.com/domaframework/doma)のバージョンは2.43.0です。
Criteria APIの概要については[Doma入門](https://qiita.com/nakamura-to/items/deaff05ba530317f3cf8)を参照してください。
利用しているJavaのバージョンは8です。

エンティティクラス`Employee`と`Department`が定義済みとします。

また、下記の変数が定義されているものとします。

“`java
Entityql entityql = new Entityql(config);
Nativesql nativeSql = new NativeSql(config);

Employee_ e = new Employee_();
Department_ d = new Department_();
“`

例示されるSQLは実際に生成されるものと異なる場合があります。

## EntityqlとNativeSqlの使い分けの原則

### Entityq

元記事を表示

OTHERカテゴリの最新記事