Java механизм отражения - Почерк springioc

Что такое Java отражение

Бег, динамический доступ ко всей информации, класс

Роль рефлексии

1, декомпилировать: .class -> Java - .
2. объект Java , доступ через отражательные свойства, методы, метод строительства и тому подобное;

Сценарии отражения

драйвер JDBC нагрузки -----
Весна МОК
рамки

Создание Reflection API

Метод имя роль
getDeclaredMethods [] получить все такие методы
getReturnType () Получают возвращаемое значение таких
getParameterTypes () Возвращает параметр передается
getDeclaredFields () Возвращает все поля класса
setAccessible разрешить доступ к закрытым членам

Есть три класса метод отражения Get

//第一种方式:  
	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 {
государственной статической силы основных (String [] арг) бросает исключение {
//加载驱动类
Class.forName ( «com.mysql.jdbc.Driver»);
//通过DriverManager获取数据库连接
Строка URL = «JDBC: MySQL: //192.168.1.150/test»;
Пользователь String = «TeamTalk»;
Строка пароля = «123456»;
Подключение Подключение = (подключение) DriverManager.getConnection (
URL, пользователь, пароль);
PreparedStatement оператор = (PreparedStatement) connection.prepareStatement (
«значение вставки перса (имя, возраст) (,)?»);
statement.setString (1, «HDU»);
statement.setInt (2, 21);
statement.executeUpdate ();
ResultSet Resultset = statement.executeQuery ( «выберите * от перса»);
// установить результат операции Resultset
в то время как (ResultSet.next ()) {
// Получить первое поле режима
System.out.println (resultSet.getString (. 1) + "" +
resultSet.getString (2) + "" + результирующего .getString) (3.);
}
// закрытие соединения
ResultSet.close ();
Statement.close ();
connection.close ();
}
}


Запретите использование отражения Initialize

Конструктор для приватизации

Что такое SpringIOC

Что такое SpringIOC, взаимосвязь между каждым из фасоли (классы сущностей) и бобовые (сущность) к руководству третьей стороны контейнера.
applicationContext.xml


<? XML версия = "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>

объект


Класс пользователь публичного {
личное строковый идентификатор;
частное имя строки;
частный элемент списка;
Public User () {
супер ();
// TODO Auto-порожденный конструктор окурок
}
Public User (String ID, имя String, Элемент списка) {
супер ();
this.id = ID;
this.name = имя;
this.item = пункт;
}
Строка GetId общественности () {
возвращение идентификатор;
}
Общественного недействительными SETID (String ID) {
this.id = ID;
}
Строка GetName общественности () {
возвращение имя;
}
Общественной недействительная SetName (имя String) {
this.name = имя;
}
Общественного Список GetItem () {
возвращенный деталь;
}
общественного недействительной SetItem (Элемент списка) {
this.item = пункт;
}
@Override
общественного Строка ToString () {
возвращение «Пользователь [ID =» + + идентификатор «имя =» + имя + «пункт =» + пункт + «]»;
}
}


общественный класс Item {
частная строка EMAILADDRESS;
частная строка homeAddress;
Строка общественного getEmailAddress () {
вернуться EMAILADDRESS;
}
Общественного недействительными setEmailAddress (Строка EMAILADDRESS) {
this.emailAddress = EMAILADDRESS;
}
Строка getHomeAddress общественности () {
возвращение homeAddress;
}
Общественного недействительными setHomeAddress (Строка homeAddress) {
this.homeAddress = homeAddress;
}
}

springioc вызов

класс ClassPathXmlApplicationContext общественного {
/ **
* SpringIOC-练习反射
* /
частные статические строки PATH;
частные статические строки ID;
частные статические строки CLASS;
частных статических String Name;
частная статические строки VALUE;

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 найти конфигурацию бина и получить адрес класса файла конфигурации.
Технология отражения объекта Пример 3. Использование Java
конфигурации атрибутов 4. Достаньте, метод присваивания с помощью отражения.
Подробности Шаг
1. Используя параметры , передаваемые в приобретении потока файл XML, и анализируются в объект документа с помощью dom4j
2. После получения корневого элемента объекта при соблюдении следующих условий этикетки траверс документа, определяет , имеется ли соответствующий идентификатор.
3. Если будет установлено соответствующий идентификатор, чтобы найти эквивалентный элемент элемент начинает создавать объекты, чтобы получить атрибут класса, в соответствии с атрибутами , установленного объектом отражения.
4. теги свойства Loop в теге, и стоимость имущества. Обратите внимание , что, чтобы иметь дело отдельно ИНТ, атрибут типа с плавающей точкой. конфигурации XML , поскольку эти атрибуты настраиваются в виде строки, таким образом , требует дополнительной обработки.
5. Если свойство тег имеет атрибут атрибут реф, что указывает на значение свойства объекта, в соответствии с идентификатор (реф значения атрибутов) , чтобы получить объект , соответствующий реф, чтобы дать задание свойств.
6. создается обратный объект, если нет соответствующего удостоверения или без нижестоящего тега будет возвращать нуль

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
рекомендация