反射枠のデザインが魂である
(前提条件:クラスのバイトコードの代表である必要があり得、Classクラスは、.classファイルを表すために使用される(バイトコード))
反射の概要
クラスは、すべての反射のルートである、Javaリフレクション機構は、このクラスのすべてのプロパティおよびメソッドを知ることができる反射によって、任意のクラスのために、動作状態にある、任意のオブジェクトについて、そのメソッドとプロパティを呼び出すことが可能です;反射情報を取得し、Java言語と呼ばれるメソッドを移動この動的関数呼び出しオブジェクト
クラスの解剖学的構造にするために、最初のファイル・オブジェクト・クラスのバイトコードを取得しなければなりません。クラスは、解剖学のクラスで使用されるメソッドです。クラスは非常に最初のバイトコードファイルに対応する各オブジェクトタイプを取得しました。
私が理解し、メソッドクラスのクラスは、直接文字列で転送するのは簡単です。
反射作用
Javaオブジェクトの反射プロパティ、メソッド、および他の工法にアクセスすることによって
反射機構クラス
次のように反射に関連付けられているJavaクラス:
クラス名 | 使用 |
---|---|
クラスクラス | Javaアプリケーションの実行中のエンティティのクラスを代表してクラスおよびインタフェースを表し |
Fieldクラス | クラスのメンバ変数に代わって(もクラス属性のメンバ変数として知られています) |
メソッドのクラス | この方法は、以下のクラスを表します |
コンストラクタ | 代表クラスのコンストラクタ |
注意:Objectクラスのサブクラス
反射の基本的なメカニズム
:可能な「完全なクラス名文字列は、」一によれば、クラス・オブジェクトのクラスの表現は、その後、クラスオブジェクトに応じて、このクラスの実際のオブジェクトのインスタンスを作成
クラスを与えるために使用可能にClass.forName(「クラス・パッケージ名」)方法カテゴリ
String className = "cn.edu360.javase24.reflect.demo.SerivceOne"; // 通常这个字符串常常存在文件当中,用io流调用
Class<?> forName = Class.forName(className); // 根据类名字符串“SerivceOne”获取class对象
SerivceOne o = (SerivceOne)forName.newInstance(); // 用class对象构造出这个类SerivceOne的实例对象
o.say();
そして、反射は、多くの場合、インタフェースで使用されている
私たちはその後、ファイルに保存し、実装クラスのパッケージ名の良いを完了することで合意し、インターフェースファックだけでなく、その実装クラスFuckImplを持っているように、ここのように。
そして、私たちはこのインターフェースを呼び出すときはそうすることができます
public class Menu {
public static void main(String[] args) throws Exception {
// 从约定的文件中读取所需类的实现类全名
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("f:/a.txt")));
String ClassName = br.readLine(); /将文件中的按行包名输出
Class<?> forName = Class.forName(ClassName); // forName代表的是serviceClassName字符串所指定的类的类class模板
// 根据类全名构造这个service实现类的实例
Fuck fuck = (Fuck) forName.newInstance();`}}
第三に、反射、プロパティとメソッドで取得したクラスのコンストラクタ
Class<?> forName = Class.forName(ClassName);
// 根据类全名构造这个service实现类的实例
Fuck fuck = (Fuck) forName.newInstance();`
//methodName存的是方法名的字符串,从forName这个class模板中获取到指定的方法
Method method=forName.getMethod(methodName) ;
//让Method在对象上执行,()中写对象和参数
Object invoke=method.invoke(fuck,12);
-------------------------------------------------------------------------
//如果存在同名方法,则有参数的需要这样输入
Method method2=forName.getMethod(methodName,String.Class) ;
Object invoke=method.invoke(fuck,12);
コンフィギュレーション・ファイルの使用ガジェットプロパティ()
プロパティの主な方法
(1)負荷(入力ストリームあるinStream)
このメソッドは、ファイル入力ストリームの.properties、負荷クラスオブジェクトのプロパティリストからプロパティに属性に対応してもよいです。次のコード:
Properties pro = new Properties();
FileInputStream in = new FileInputStream("a.properties");
pro.load(in);
in.close();
(2)店舗(OutputStreamのうち、文字列コメント)
このメソッドは、出力ストリームに属性のプロパティクラスのオブジェクトのリストが保存されます。次のコード:
FileOutputStream oFile = new FileOutputStream(file, "a.properties");
pro.store(oFile, "Comment");
oFile.close();
コメントが空でない場合は、ファイルを保存する最初の行は#commentsある属性、コメント情報を表し、ノーコメントは空でない場合。
注釈情報は、プロパティファイルの保存現在の時刻より遅れています。
(3)のgetProperty / setPropertyを
これらの2つの方法は、それぞれ取得し、セットプロパティ情報です。
プロファイルの読み込みと反射特性を
Properties props = new Properties();
//加载xx.properties属性配置文件
props.load(Test.class.getClassLoader().getResourceAsStream("xx.properties"));
//取配置参数
String value = props.getProperty("key");
Class<?> forName = Class.forName(value); // forName代表的是serviceClassName字符串所指定的类的类class模板
// 根据类全名构造这个service实现类的实例
Fuck fuck = (Fuck) forName.newInstance();`
そして、パッケージに直接*** ***ファイルに確立すべき
コンテンツである
キー=値の形で
ClassName=fuckMan
Method=fuck
匿名内部クラス
匿名内部クラスの内部クラスの名前です。
名前がないので、その匿名内部クラスは、それが通常の簡素化コードを書くために使用され、一度使用することができます
しかし、匿名内部クラスの使用が前提条件があります:あなたは、親クラスから継承するか、インタフェースを実装しなければならない
。例1:抽象メソッドを実装する匿名内部クラスを使用していません
abstract class Person {
public abstract void eat();
}
class Child extends Person {
public void eat() {
System.out.println("eat something");
}
}
public class Demo {
public static void main(String[] args) {
Person p = new Child();
p.eat();
}
}
業績:何かを食べます
あなたは私たちが子供のPersonクラスに継承されたことを確認した後、子のインスタンスを実装することができPersonクラスにアップキャストされ参照
ここでは子クラスは一度だけ使用されている場合しかし、それは別のカテゴリーとして書かれているたくさんの悩みではないでしょうか?
匿名内部クラスの導入にこの時間
例1:抽象メソッドを実装する匿名内部クラスを使用していません
abstract class Person {
public abstract void eat();
}
class Child extends Person {
public void eat() {
System.out.println("eat something");
}
}
public class Demo {
public static void main(String[] args) {
Person p = new Child();
p.eat();
}
}
結果を操作する:何か食べる
あなたが見ることができますが、私たちは子供Personクラスを継承して、子供のインスタンスを実装Personクラスにアップキャストされ参照
ここでは子クラスは一度だけ使用されている場合しかし、それは別のカテゴリーとして書かれているたくさんの悩みではないでしょうか?
匿名内部クラスの導入にこの時間
は基本的に匿名内部クラス:例2
abstract class Person {
public abstract void eat();
}
public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}
業績:何か食べ
括弧内抽象クラスPersonの実装では、あなたが見ることができるが、我々は直接法
だから、書くクラスを省略することができること
さらに、匿名内部クラスは、インターフェイス上で使用することができます
例3:インターフェイスの使用匿名内部クラス
interface Person {
public void eat();
}
public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}
業績:何かを食べます