/ / खेतों के बाद विधि निष्पादन को आरंभीकृत किया जाता है - जावा, पहलू

फ़ील्ड के बाद विधि निष्पादन शुरू किया गया है - जावा, पहलू

मेरे पास एक वर्ग है जो एक डेटाबेस के लिए पंक्ति पहुंच को परिभाषित करता है।

public abstract class DBRow {
int index;

DBConnection connection;

public DBRow(DBConnection con, int id) {
connection = con;
index = id;
}

public DBRow(DBConnection con) {
this(con, -1);
}

public abstract String getTableName();

private static String getFieldName(Field field) {
...
}

public void save() {
... (Reads all fields that are annotated with @InDB and saves them
}

public void load() {
... (Will load a row from the database or create a new one if index == -1)
}
}

डेटाबेस में एक विशिष्ट पंक्ति इस DBRow वर्ग का विस्तार करती है। उदाहरण के लिए:

public class Test extends DBRow {
@InDB
public String vct;

@InDB
public int intt;

public Test(DBConnection con, int id) {
super(con, id);

vct = "test";
intt = 123;
}

@Override
public String getTableName() {
return "test";
}
}

निर्माणकर्ता को "लोड" कहा जाने के बाद कहा जाना चाहिए, इसलिए पंक्ति डेटाबेस से लोड हो जाती है या बनाई जाएगी और ठीक से सहेजी जाएगी।

public aspect DBRowLoadSave {
pointcut load() : execution(DBRow.new(*, *));

after() : load() {
((DBRow)thisJoinPoint.getThis()).load();
}
}

मेरी समस्या यह है, कि इस बिंदु पर क्षेत्र करेंगेप्रारंभ नहीं किया जा सकता है, क्योंकि पॉइंटकट टेस्ट की मदर क्लास में कंस्ट्रक्टर कॉल को सुनता है, टेस्ट में ही नहीं। क्या कोई तरीका है जो मैं बच्चे वर्गों के सभी कंस्ट्रक्टरों को सुन सकता हूं, या क्या कोई अन्य तरीका है जो मैं कक्षा के पूर्ण रूप से निष्क्रिय होने के बाद लोड विधि को निष्पादित कर सकता हूं?

उत्तर:

जवाब के लिए 2 № 1

execution(DBRow+.new(..)) सभी उपवर्ग निर्माणकर्ताओं से मेल खाता है, लेकिन इसमें बेस क्लास शामिल है। इसलिए आपको इसके माध्यम से बाहर करने की आवश्यकता है !execution(DBRow.new(..)).

इसके अलावा आप बनायी गयी वस्तु को एक चर के माध्यम से सीधे बाँध सकते हैं this(), से परहेज getThis() सलाह के भीतर कॉल और कास्ट करें।

public aspect DBRowLoadSave {
pointcut load(DBRow dbRow) :
execution(DBRow+.new(..)) &&
!execution(DBRow.new(..)) &&
this(dbRow);

after(DBRow dbRow) : load(dbRow) {
System.out.println(thisJoinPoint);
dbRow.load();
}
}

जवाब के लिए 0 № 2

मुझे यकीन नहीं है कि वास्तव में क्या चल रहा है, क्योंकि आपके निर्माता किसी भी तरीके को नहीं बुला रहे हैं, इसलिए ऑब्जेक्ट को सक्रिय करने के साथ कोई समस्या नहीं होनी चाहिए। कुछ अनुमानों में सुधार होगा:

public Test(DBConnection con, int id) {
vct = "test";
intt = 123;
super(con, id);
}

सुपर कंस्ट्रक्टर को कॉल करने से पहले मान सेट करना, या

public String vct = "test";

public int intt = 123;

public Test(DBConnection con, int id) {
super(con, id);
}

मानों को सीधे फ़ील्ड्स के रूप में सेट करना। यदि ये काम नहीं करते हैं, तो प्रारंभ के साथ कोई समस्या नहीं है और समस्या कहीं और है।