Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Динам.создание переменной класса и заполнение полей / 8 сообщений из 8, страница 1 из 1
29.11.2013, 01:39:03
    #38482745
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динам.создание переменной класса и заполнение полей
Доброго дня господа !

Имею заполнение полей класса в Hibernate
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
     SessionFactory factory = config.buildSessionFactory(); 
     Session session = factory.getCurrentSession();
     session.beginTransaction();
     Kind kind0 = new Kind();
     kind0.setKind("00390");
     kind0.setNaim("Кредитные операции");
     session.saveOrUpdate(kind0);

     Pind pind0 = new Pind();
     pind0.setPind(100);
     pind0.setNaim("Автомобили");
     pind0.setType("Грузовые");
     session.saveOrUpdate(pind0);



Хотелось бы иметь некую универсальную процедуру, которая заполнила бы из текстовика
различный набор полей для разных классов (т.е Kind и Pind)

Можно ли реализовать динамическое объявление переменной класса и чтение его полей по аннотациям Hibernate


Kind record = new Kind();
или
Pind record = new Pind();


В цикле анализирует listMapping (DAY=1;KIND=2 /1,2- номер столбца в текстовике и массиве)
record.Field(FieldName) = lineStr[0];

FieldName - это из аннотации Hibernate @Column=DAY



Заранее благодарен !

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
import java.io.File;
import org.hibernate.Session;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ExportData {
	private Session session;
	private String fileName;
	private Class  className;
	private String listMapping;
	private char   delimited;
	
	public ExportData(Session session, String fileName,Class className,String listMapping,char delimited,boolean execute) {
		setSession(session);
		setFileName(fileName);
		setClassName(className);
		setListMapping(listMapping);
		setDelimited(delimited);
		if(execute){
			ExecuteExport();
			}
		}
	
	public void ExecuteExport(){
		System.out.println("Export");
		if(session!=null && fileName!=null && delimited!='0'){
			Scanner readFile = null;
			try{
				readFile = new Scanner(new File(fileName));
				} catch (FileNotFoundException except) {
					except.printStackTrace();
					}
			while(readFile.hasNext()){
				String[] lineStr = readFile.nextLine().split(String.valueOf(delimited));
				Kind record   = new Kind();
				record.setKind(lineStr[0]);
				record.setNaim(lineStr[1]);
				record.setTime(Integer.parseInt(lineStr[2]));
				session.saveOrUpdate(record);
				}
			}
	}
	
   Getter+Setter процедуры	
}
...
Рейтинг: 0 / 0
29.11.2013, 11:55:25
    #38483036
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динам.создание переменной класса и заполнение полей
Такое что-нибудь заюзать
http://opencsv.sourceforge.net/
...
Рейтинг: 0 / 0
29.11.2013, 21:35:57
    #38484116
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динам.создание переменной класса и заполнение полей
Blazkowicz,

Спасибо за диалог, по статье не нашел ПРЯМОГО ответа на вопрос

Как реализовать динам. обьявление класса
Код: java
1.
Kind record   = new Kind();



Это вообще возможно в Jave ?

Взять абстрактный указатель объект и привести к заданному параметров функции классу ?
public ExportData(Class className) {
Class record = new Class();

}

типа такого .....
...
Рейтинг: 0 / 0
29.11.2013, 23:50:31
    #38484188
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динам.создание переменной класса и заполнение полей
HOME_XBlazkowicz,

Спасибо за диалог, по статье не нашел ПРЯМОГО ответа на вопрос

Как реализовать динам. обьявление класса
Код: java
1.
Kind record   = new Kind();



Это вообще возможно в Jave ?

Взять абстрактный указатель объект и привести к заданному параметров функции классу ?
public ExportData(Class className) {
Class record = new Class();

}

типа такого .....

если я правильно понял

если String className
Код: java
1.
Class.forName(className).newInstance(); 


если все-таки Class _class
Код: java
1.
_class.newInstance()



А если по сабжу, почитайте по про jaxb
...
Рейтинг: 0 / 0
30.11.2013, 11:11:45
    #38484306
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динам.создание переменной класса и заполнение полей
...
Рейтинг: 0 / 0
01.12.2013, 13:21:03
    #38484926
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динам.создание переменной класса и заполнение полей
Blazkowicz,

Спасибо за ссылку - работаю
...
Рейтинг: 0 / 0
02.12.2013, 19:04:26
    #38486474
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динам.создание переменной класса и заполнение полей
Господа а передать и привести к типу параметр сетера ? (тип неизвестен )

Пример кода привожу
Поле А - это целое
Как описать в этом случае тип параметра
Method setMethod = anyClass.getDeclaredMethod("set"+itemEqual.getValue().toString().split("[ |.]")[6].toUpperCase(), new Class[] { String.class });


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
package TimeSheet;

import static java.lang.System.out;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.String;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map.Entry;

import javax.persistence.Column;
import javax.persistence.Id;

public class Example {
	public static void main(String[] args) throws Exception {
		String title = "F4;F3;F1;F2";
		String value = "D1;15;AA;12";

		ArrayList<String> listTitle = new ArrayList(Arrays.asList(title.toUpperCase().split(";")));
		String[]          listValue = value.split(";");
		
		HashMap<Integer,Field> listEqual = new HashMap<Integer,Field>();
		Class anyClass = Class.forName("TimeSheet.AnyClass");
		Field[] listField = anyClass.getDeclaredFields();
	    if(listField.length!=0){
	    	for(Field itemField : listField){
		    	Annotation[] listNote = itemField.getAnnotations();
		    	if(listNote.length!=0){
		    		for(Annotation itemNote : listNote){
			    		String note = itemNote.toString().toUpperCase();
			    		if(note.matches("@JAVAX.PERSISTENCE.COLUMN.*")){
			    			int i = listTitle.indexOf(note.split("[=|,]")[11]);
			    			if(i>-1){
			    			  listEqual.put(i,itemField);
			    			}
			    		}	
		    		}
		    	}
	    	}
	    }
	    Object anyObject = anyClass.newInstance();
	    for(Entry<Integer,Field> itemEqual : listEqual.entrySet()){
	    	Method setMethod = anyClass.getDeclaredMethod("set"+itemEqual.getValue().toString().split("[ |.]")[6].toUpperCase(), new Class[] { String.class });
	    	setMethod.invoke(anyObject,new Object[] { listValue[itemEqual.getKey()] });
		    //Method getMethod = anyClass.getDeclaredMethod("get"+itemEqual.getValue().toString().split("[ |.]")[6].toUpperCase());
			//Object getObject = getMethod.invoke(anyObject);
	    }
	}
	
}
	
class AnyClass {
	
	@Id
	@Column(name="F1",columnDefinition="varchar2(10 char)")
	private String s;
	
	@Column(name="F2")
	private String c;

	@Column(name="F3")
	private int a;
	
	public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}

	public String getS() {
		return s;
	}

	public void setS(String s) {
		this.s = s;
	}

	public String getC() {
		return c;
	}

	public void setC(String c) {
		this.c = c;
	}

	
}
...
Рейтинг: 0 / 0
02.12.2013, 20:08:33
    #38486572
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динам.создание переменной класса и заполнение полей
HOME_X,

Типа такого напрашиваеться - это верный подход ?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
	    	if(itemEqual.getValue().getType().getName()=="java.lang.String"){
		    	Method setMethod = anyClass.getDeclaredMethod("set"+itemEqual.getValue().getName().toUpperCase(), new Class[] { String.class });
		    	setMethod.invoke(anyObject,new Object[] { listValue[itemEqual.getKey()] });
			    Method getMethod = anyClass.getDeclaredMethod("get"+itemEqual.getValue().getName().toUpperCase());
				Object getObject = getMethod.invoke(anyObject);
				out.format("%s%n",getObject.toString());
	    	}
	    	if(itemEqual.getValue().getType().getName()=="int"){
		    	Method setMethod = anyClass.getDeclaredMethod("set"+itemEqual.getValue().getName().toUpperCase(), new Class[] { int.class });
		    	setMethod.invoke(anyObject,new Object[] { Integer.parseInt(listValue[itemEqual.getKey()]) });
		    	Method getMethod = anyClass.getDeclaredMethod("get"+itemEqual.getValue().getName().toUpperCase());
				Object getObject = getMethod.invoke(anyObject);
				out.format("%s%n",getObject.toString());
	    	}
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Динам.создание переменной класса и заполнение полей / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]