Javaリフレクションメカニズム - 手書きspringioc

Javaのリフレクションとは何ですか

すべての情報への実行、ダイナミックアクセスクラス

反射の役割

1、デコンパイル:.classファイル- > Javaの。
2。反射特性、方法、施工方法等を介してアクセスするJavaオブジェクト。

反射のシナリオ

JDBC負荷ドライバ-----
春IOC
フレームワーク

リフレクションAPIを作成します。

メソッド名の役割
getDeclaredMethods []取得するすべてのそのような方法
getReturnType()は、このようなの戻り値を取得します
getParameterTypesを()のパラメータ渡さ
getDeclaredFieldsを()クラスのすべてのフィールドを取得します。
プライベートメンバーへのアクセスを許可setAccessible

三つのクラスがあり反射法取得

//第一种方式:  
	Classc1 = Class.forName("Employee");  
	//第二种方式:  
	//java中每个类型都有class 属性.  
	Classc2 = Employee.class;  
	   
	//第三种方式:  
	//java语言中任何一个java对象都有getClass 方法  
	Employeee = new Employee();  
	Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)  	

オブジェクトを作成する方法のリフレクション

Class<?> forName = Class.forName("com.itmayiedu.entity.User");
	// 创建此Class 对象所表示的类的一个新实例 调用了User的无参数构造方法.
	Object newInstance = forName.newInstance();

パラメータの例には、コンストラクタを持っています

	Class<?> forName = Class.forName("com.itmayiedu.entity.User");
	Constructor<?> constructor = forName.getConstructor(String.class, String.class);
	User newInstance = (User) constructor.newInstance("123", "123");

JDBCドライバのロード反射


パブリッククラスDemoJDBC {
公共の静的な無効メイン(文字列[]引数)が例外をスロー{
//加载驱动类
にClass.forName(「はcom.mysql.jdbc.Driverを」);
//通过DriverManagerの获取数据库连接
文字列のURL =「はjdbc:mysqlの://192.168.1.150/test」;
文字列のユーザー=「teamtalk」。
文字列のパスワード=「123456」;
接続の接続=(接続)にDriverManager.getConnection(
URL、ユーザー、パスワード);
PreparedStatementの声明=(のPreparedStatement)のConnection.prepareStatement(
「挿入persion(名前、年齢)の値(、)?」);
statement.setString(1、「HDU」)。
statement.setInt(2、21)。
statement.executeUpdate();
ResultSetのたresultSet = statement.executeQuery(「persion SELECT * FROM」);
//演算結果が結果セットを設定
しながら(ResultSet.next()){
//第1モードフィールド取得
するSystem.out.println(resultSet.getString(1)+ "" +
+ resultSet.getString(2)+ "" ResultSetを.getString)(3);
}
//近い接続
ResultSet.close();
Statement.close();
Connection.close();
}
}


反射の使用を禁止する初期化

民営化のためのコンストラクタ

SpringIOCは何ですか

SpringIOCは何ですか、サードパーティ製のコンテナ管理の豆(エンティティクラス)とBean(エンティティ)のそれぞれとの間の関係です。
applicationContext.xmlを


<?xml version = "1.0" エンコード= "UTF-8"?>

<bean id="user1" class="entity.User">
	<property name="id" value="0002"></property>
	<property name="name" value="张三"></property>
	<!-- 给list注入值 list 中可以有相当的对象 -->
	<property name="item">
		<list>
			<ref bean="item2" />
		</list>
	</property>
</bean>
<bean id="user2" class="entity.User">
	<property name="id" value="00022"></property>
	<property name="name" value="张三2"></property>
	<!-- 给list注入值 list 中可以有相当的对象 -->
	<property name="item">
		<list>
			<ref bean="item1" />
		</list>
	</property>
</bean>



<bean id="item1" class="entity.Item">
	<property name="emailAddress" value="[email protected]"></property>
	<property name="homeAddress" value="成都"></property>
</bean>
<bean id="item2" class="entity.Item">
	<property name="emailAddress" value="[email protected]"></property>
	<property name="homeAddress" value="北京"></property>
</bean>

エンティティ


パブリッククラスユーザー{
プライベート文字列ID;
プライベート文字列名;
プライベートリスト項目。
パブリックユーザ(){
スーパー()。
// TODO自動生成コンストラクタスタブ
}
パブリックユーザ(文字列ID、文字列名、リストアイテム){
スーパー()。
this.id = ID。
this.nameは名称。
this.item項目を=。
}
パブリック文字列のgetId(){
戻りID。
}
公共ボイドSETID(文字列ID){
this.id = ID。
}
パブリック文字列のgetName(){
戻り名。
}
公共ボイドのsetName(文字列名){
this.name =名。
}
パブリックリストのgetItem(){
戻りアイテム。
}
公共ボイドSetItem関数(リスト項目){
this.item =項目。
}
@Override
パブリック文字列のtoString(){
戻り「ユーザー[ID =」+ ID +「NAME =」+名+「項目=」+アイテム+「]」。
}
}


パブリッククラス項目{
プライベート文字列EMAILADDRESS。
プライベート文字列homeAddress。
パブリック文字列getEmailAddress(){
EMAILADDRESSを返します。
}
公共ボイドsetEmailAddress(文字列EMAILADDRESS){
this.emailAddress = EMAILADDRESS。
}
パブリック文字列getHomeAddress(){
戻りhomeAddress。
}
公共ボイドsetHomeAddress(文字列homeAddress){
this.homeAddress = homeAddress。
}
}

springiocコール

パブリッククラスClassPathXmlApplicationContext {
/ **
* SpringIOC-练习反射
* /
プライベート静的文字列PATH;
プライベート静的な文字列ID;
プライベート静的な文字列クラス。
プライベート静的な文字列NAME。
プライベート静的文字列値。

public ClassPathXmlApplicationContext(String PATH) {
	init();
	this.PATH=PATH;
}
private void init() {
	ID="id";
	CLASS="class";
	NAME="name";
	VALUE="value";
}
private Object getBean(String beanId) throws DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException {
	//1、解析XML
	if(StringUtils.isEmpty(beanId)) {
		return null;
	}
	SAXReader saxReader=new SAXReader();
	Document read = saxReader.read(this.getClass().getClassLoader().getResource(PATH));
	Element rootElement = read.getRootElement();
	@SuppressWarnings("unchecked")
	List<Element> elements = rootElement.elements();
	for(Element lel:elements) {

		String id = lel.attributeValue(ID);
		if(beanId.equals(id)) {
			continue;
		}
		//2、使用beanid查找对应的xml节点,获取class节点属性
		//获取bean
		String attclass = lel.attributeValue(CLASS);
		//3、使用java反射机制初始化类
		Class<?> forName = Class.forName(attclass);
		Object newInstance = forName.newInstance();
		//获取属性值
		@SuppressWarnings("unchecked")
		List<Element> elements2 = lel.elements();
		for(Element el:elements2) {
			String attField = el.attributeValue(NAME);
			String attFieValue = el.attributeValue(VALUE);
			Field declaredField = forName.getDeclaredField(attField);
			declaredField.setAccessible(true);
			declaredField.set(newInstance, attFieValue);
		}
		 return newInstance;
	}
	return null;
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException, DocumentException {
	ClassPathXmlApplicationContext classPathXmlApplicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
	User bean = (User) classPathXmlApplicationContext.getBean("item1");
	System.out.println(bean.toString());
}

}

SpringIOC原則基本的な実装

1.読み取り豆のXML設定ファイル
2. beanIdは、Beanの設定を見つけ、設定ファイルクラスのアドレスを取得します。
例3. Javaのリフレクションテクノロジオブジェクト
4. GET属性の設定、リフレクションを使用して割り当て手法。
詳細には、ステップ
ストリーム取得XMLファイルに渡されたパラメータを使用して1.、およびDOM4J用いた文書オブジェクトに解析された
2次ラベル文書トラバースに対象被写体のルート要素を取得した後、一致するIDが存在するか否かを判定する。
3.見つかった場合同等の要素素子が反射物体によって確立された属性に従って、クラス属性を取得するために、オブジェクトを作成し始める。見つけるために、IDに対応する
別々 INTを対処する、こと4.ループプロパティタグをタグに、および値プロパティ。メモ、 float型の属性。XML構成これらの属性は、このように追加の処理を必要とする、文字列の形に構成されているからである。
5.プロパティタグは、属性ref属性を持っている場合、プロパティの値を示すことに応じて、目的としますID(REF属性値)プロパティの割り当てを与えるために、REFに対応するオブジェクトを取得します。
6.該当するIDが存在しない場合、戻りオブジェクトは、作成された、または子タグなしのヌルを返します。

Mavenのアドレス


<dependency>
			<groupId>org.apache.commons</groupId>
		<artifactId>commons-lang3</artifactId>
		<version>3.4</version>
	</dependency>
	
	<dependency>
		<groupId>org.dom4j</groupId>
		<artifactId>dom4j</artifactId>
		<version>2.0.0</version>
</dependency>
公開された26元の記事 ウォンの賞賛0 ビュー699

おすすめ

転載: blog.csdn.net/YHM_MM/article/details/103977196