このブログは99%ののほほんと1%のお菓子でできています。
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
こんちゃ(´・ω・)ノ
今回はJavaの監視ツールについて。
Javaでは標準でJavaの監視ツールが入ってたり入ってなかったりする。
sunからJDKを落としてきて入れている人は、
たぶん監視ツールが[JAVA_HOME]/bin/配下にあるだろう。
その中から監視に使えるツールを紹介します。
基本的にヒープ使用量などの監視ができます。
◆まとめ
今回はWindowsで行っているが、
JavaはOSを選ばないため、
環境があればLinuxで普通に動きます。
アプリケーションの作りで、
Javaシステムのパフォーマンスが悪くなったりしますが、
監視をすることで、
設定ミスなどによるボトルネックの検出ができるかもしれません。
単純にJavaアプリの作りが悪いのではなく、
javaの基本的なチューニングや監視も覚えておきましょう。
こんちゃ(´・ω・)ノ
今回はプロパティファイルの読み込みです。
プロパティファイルとは以下のようなファイル。
--------------------------------------------
sample.properties
--------------------------------------------
text.file.name=sample.txt
text.file.path=C:\SAMPLE\
http.server.url=http://sample.co.jp
http.server.port=8080
dao.class.name=jp.co.sample.dao.SampleDAO
validation.check=true
--------------------------------------------
このプロパティファイルをjavaで読み込むことで、
処理を決定して様々な動作をさせることができる。
◆サンプル
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
public class Sample{
private static final String PROPERTY_FILE = "sample.properties";
private static final String TEXT_FILE_NAME = "text.file.name";
private static final String TEXT_FILE_PATH = "text.file.path";
private static final String HTTP_SERVER_URL = "http.server.url";
private static final String HTTP_SERVER_PORT = "http.server.port";
private static final String DAO_CLASS_NAME = "dao.class.name";
private static final String VALIDATION_CHECK = "validation.check";
public static void main(String[] args){
Sample sample = new Sample();
try{
Properties properties = sample.loadProperties(PROPERTY_FILE);
System.out.println(properties.getProperty
(TEXT_FILE_PATH+TEXT_FILE_NAME));
System.out.println(properties.getProperty
(HTTP_SERVER_URL+":"+HTTP_SERVER_PORT));
System.out.println(properties.getProperty(DAO_CLASS_NAME));
String validationCheck = properties.getProperty(VALIDATION_CHECK);
if(validationCheck.equals("ture")){
System.out.println("チェックする");
}else{
System.out.println("チェックしない");
}
} catch (Exception e) {
e.printStackTrace();
}
}
private Properties loadProperties(String propertyFile)
throws RuntimeException{
Properties properties = new Properties();
try {
properties.load(new FileInputStream(new File(propertyFile)));
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
return properties;
}
}
◆メリット
・プログラムはコンパイルしてclassファイルになると、中々修正が面倒だが、
プロパティファイルは外部定義のため、容易に修正が可能になる。
・場合によってはプログラムを起動したままでも、処理を切り替えることができる。
◆デメリット
・設定情報が簡単に参照できる。
・動的に変化させることができるため、処理によっては制御が複雑になる。
◆まとめ
リフレクションと組み合わせることで、
動的にクラスやメソッドを決定することができ、
処理を動的に切り替えることができるのだ。
こんちゃ(´・ω・)ノ
今回はリフレクションについてです。
リフレクションとは、クラスの情報を取得して
クラスの生成やメソッドを利用したりするAPIです。
なかなかJavaの中でも難しいところだったりします。
◆例
public class Sample{
public int getCount(){
return 10;
}
}
【サンプル】通常
Sample sample = new Sample();
int count = sample.getCount();
【サンプル】リフレクション
//インスタンス作成
Object instance = Sample.class.newInstance();
//メソッド取得
Method method = Sample.class.getMethod("getCount", new Class[0]);
//メソッド実行
Integer count = (Integer)method.invoke(instance, new Object[0]);
となります。
「え?なんか色々書いてるし通常のほうが簡単でいいんじゃないか?」
と思うかもしれませんが、
これの重要なところは"文字列でメソッドを取得"しているところです。
文字列指定のため、文字列を引数などで動的に変わるようにするだけで、
動的に実行したいメソッドを決定できるのです。
また「Sample.class」の部分は「Class.forName("Sample")」とも書き換えられるため、
クラスもメソッドも動的に決定できるわけです。
◆リフレクションを使って取得できる情報または処理
・クラス名とクラスのインスタンス
・メソッドとメソッドの実行
・フィールドの名前と値
・コンストラクタ
などなど。まだ色々あると思います。
◆メリッド
リフレクションを使用することにより、
動的に使用するクラスやメソッドを変えることができる。
◆デメリット
・クラスやメソッドが変わるため例外がcatchしずらい。
・実行されるまでどのクラスやメソッドを使用するのかわからないため、処理の流れがわかりにくい。
・インタプリタ実行のため処理速度が遅い。
→ループ文などで何度も呼ばなければ全然気にならない程度。
◆使用されている機能
一般的なプログラミングではあまり使用しませんが、
StrutsなどのWebアプリケーションのフレームワークなどで多く使用されています。
こんちゃ(´・ω・)ノ
今回は共通化。
機能の共通化とも言えるかな。
プログラミングするとき、
同じような機能を何度も書いていませんか?
【例】共通化前
public class Sample{
private static final String METHOD1 = "メソッド1";
private static final String METHOD2 = "メソッド2";
public static void main(String[] args){
Sample sample = new Sample();
sample.method1();
sample.method2();
}
public void method1(){
System.out.println(METHOD1);
}
public void method2(){
System.out.println(METHOD2);
}
}
【例】共通化後
public class Sample{
private static final String METHOD1 = "メソッド1";
private static final String METHOD2 = "メソッド2";
public static void main(String[] args){
Sample sample = new Sample();
sample.methodPrint(METHOD1);
sample.methodPrint(METHOD2);
}
public void methodPrint(String str){
System.out.println(str);
}
}
このように引数で表示するものを変えるようにした。
◆メリット
・修正箇所が減少する。
・問題が発生した場合に、参照する場所が少なくなる。
・コーディング量が減少する。
◆デメリット
・メソッド名に意味固有の意味を持たせることができない。
→定数名や変数名、メソッド名である程度意味はわかる。
・引数によって条件文などを使用するケースが多くなる。
◆まとめ
デメリットもあるにはあるが、そこまでのものではない。
それよりもメリットのほうが価値が高い。
システムの運用面や修正面などで共通化はかなり重要である。
よくDAOとかで同じようなメソッドを作成するが、
中に条件文を用いて共通化したほうがいいのか、
しないほうがいいのか検討が必要。
また、開発だとクラス設計書などもあって、
共通化しないと設計の修正部分も多くなる。
「一度書いたソースは二度書かない」