JAVAベースの反射メカニズム
3331 ワード
ソースプログラムを変更しない場合は、プロファイルの形式を外部に提供することができます.
/***要件:ノートパソコンが動作します.*追加要件:マウスを1つ使用します.*マウスで説明できます.*マウスを使用する方法をノートパソコンに指定します. * public void useMouse(Mouse m){ m.open(); m.close();}これで実行できますが、後でカメラなどの他のデバイスがある場合は、ノートパソコンクラスを変更します.拡張に不利です.*プログラムは定義時に拡張性を考慮していません.***以降に登場する機能はたくさんあります.そして未知です.*ポストデバイスとノートブックの結合性を低下させるため.*事前にルールを定義する必要があります.ノートはこのルールを使用し、後期のデバイスはこのルールに合致すればノートを使用することができます.**定義ルール:*usb仕様に準拠するデバイスノートブックであれば使用できます.*ノートパソコンについて説明しています.***後期は、マウスを使用します.*このマウスはusbのルールに合致する必要があります.*USBインタフェースを実装し、マウスオブジェクトをパラメータとしてノートパソコンに渡すことを説明します.*ただし、すでに実行可能なアプリケーションでは、ソースコードを変更することは推奨されません.*拡張性を向上させるために、未知のサブクラスについては、反射技術によって実行できます.*このアプリケーションを作成するときに、反射メカニズムを追加する必要があります. * * * */ NoteBook book = new NoteBook(); book.run(); book.useUSB(null);// book.useUSB(new MouseByUSB());/*後期設備は不確定で、パラメータとして渡すことができますが、*パラメータはどのように取得しますか?*ソースプログラムを変更することなく、外部にプロファイルを提供することができます.**//1、プロファイルオブジェクトを定義します. File configFile = new File("temp\\usb.properties"); if(!configFile.exists()){ configFile.createNewFile();}//プロファイルの情報を読み込みます. Properties prop = new Properties(); // BufferedReader bufr = new BufferedReader(new FileReader(configFile)); FileReader fr = new FileReader(configFile); prop.load(fr);for(int x=1;x<=prop.size();x++){String className=prop.getProperty("usb"+x);//指定したクラスのバイトコードファイルオブジェクトを取得する.Class clazz=Class.forName(/クラスのインスタンスを作成する.USB usb=(USB)clazz.newInstance();book.useUSB(usb); } fr.close();
//エンティティークラス
//プロファイル
usb.properties
<
usb1=org.bean.reflact.tall.KeyBoardusb2=org.bean.reflact.tall.Mouseusb3=org.bean.reflact.tall.Camager
>
//出力結果
私はキーボードが閉じます私は見ますよ押して開きます私はマウスが閉じます私はマウスが開きます
/***要件:ノートパソコンが動作します.*追加要件:マウスを1つ使用します.*マウスで説明できます.*マウスを使用する方法をノートパソコンに指定します. * public void useMouse(Mouse m){ m.open(); m.close();}これで実行できますが、後でカメラなどの他のデバイスがある場合は、ノートパソコンクラスを変更します.拡張に不利です.*プログラムは定義時に拡張性を考慮していません.***以降に登場する機能はたくさんあります.そして未知です.*ポストデバイスとノートブックの結合性を低下させるため.*事前にルールを定義する必要があります.ノートはこのルールを使用し、後期のデバイスはこのルールに合致すればノートを使用することができます.**定義ルール:*usb仕様に準拠するデバイスノートブックであれば使用できます.*ノートパソコンについて説明しています.***後期は、マウスを使用します.*このマウスはusbのルールに合致する必要があります.*USBインタフェースを実装し、マウスオブジェクトをパラメータとしてノートパソコンに渡すことを説明します.*ただし、すでに実行可能なアプリケーションでは、ソースコードを変更することは推奨されません.*拡張性を向上させるために、未知のサブクラスについては、反射技術によって実行できます.*このアプリケーションを作成するときに、反射メカニズムを追加する必要があります. * * * */ NoteBook book = new NoteBook(); book.run(); book.useUSB(null);// book.useUSB(new MouseByUSB());/*後期設備は不確定で、パラメータとして渡すことができますが、*パラメータはどのように取得しますか?*ソースプログラムを変更することなく、外部にプロファイルを提供することができます.**//1、プロファイルオブジェクトを定義します. File configFile = new File("temp\\usb.properties"); if(!configFile.exists()){ configFile.createNewFile();}//プロファイルの情報を読み込みます. Properties prop = new Properties(); // BufferedReader bufr = new BufferedReader(new FileReader(configFile)); FileReader fr = new FileReader(configFile); prop.load(fr);for(int x=1;x<=prop.size();x++){String className=prop.getProperty("usb"+x);//指定したクラスのバイトコードファイルオブジェクトを取得する.Class clazz=Class.forName(/クラスのインスタンスを作成する.USB usb=(USB)clazz.newInstance();book.useUSB(usb); } fr.close();
<NoteBook.java>
package org.bean.reflact.tall;
public class NoteBook {
public void useUSB(USB usb)
{
if(usb!=null)
{
usb.close();
usb.start();
}
}
}
<USB.java>
package org.bean.reflact.tall;
public interface USB {
public void start();
public void close();
}
<Test.java>
package org.bean.reflact.tall;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
public class Test {
public static void main(String[] args) {
NoteBook book=new NoteBook();
File file=new File("temp\\usb.properties");
try {
FileReader fread=new FileReader(file);
Properties properties=new Properties();
try {
properties.load(fread);
for(int i=1;i<=properties.size();i++)
{
String value=properties.getProperty("usb"+i);
try {
Class clazz=Class.forName(value);
//
try {
USB usb=(USB)clazz.newInstance();
book.useUSB(usb);
} catch (InstantiationException
| IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//エンティティークラス
Mouse,KeyBoard,Camera
//プロファイル
usb.properties
<
usb1=org.bean.reflact.tall.KeyBoardusb2=org.bean.reflact.tall.Mouseusb3=org.bean.reflact.tall.Camager
>
//出力結果
私はキーボードが閉じます私は見ますよ押して開きます私はマウスが閉じます私はマウスが開きます