Groovy - Lập trình đối tượng Meta
Lập trình đối tượng meta hoặc MOP có thể được sử dụng để gọi động các phương thức và cũng có thể tạo các lớp và phương thức một cách nhanh chóng.
Vì vậy, điều này có nghĩa là gì? Hãy xem xét một lớp được gọi là Sinh viên, là một lớp trống không có biến hoặc phương thức thành viên. Giả sử nếu bạn phải gọi các câu lệnh sau trên lớp này.
Def myStudent = new Student()
myStudent.Name = ”Joe”;
myStudent.Display()
Bây giờ trong lập trình đối tượng meta, mặc dù lớp không có tên biến thành viên hoặc phương thức Display (), đoạn mã trên vẫn hoạt động.
Làm thế nào điều này có thể hoạt động? Để điều này diễn ra tốt đẹp, người ta phải triển khai giao diện GroovyInterceptable để kết nối vào quá trình thực thi của Groovy. Sau đây là các phương pháp có sẵn cho giao diện này.
Public interface GroovyInterceptable {
Public object invokeMethod(String methodName, Object args)
Public object getproperty(String propertyName)
Public object setProperty(String propertyName, Object newValue)
Public MetaClass getMetaClass()
Public void setMetaClass(MetaClass metaClass)
}
Vì vậy, trong mô tả giao diện ở trên, giả sử nếu bạn phải triển khai invokeMethod (), nó sẽ được gọi cho mọi phương thức tồn tại hoặc không tồn tại.
Thiếu thuộc tính
Vì vậy, hãy xem một ví dụ về cách chúng ta có thể triển khai Lập trình đối tượng Meta cho các Thuộc tính bị thiếu. Những điều quan trọng sau đây cần được lưu ý về mã sau.
Lớp Sinh viên không có biến thành viên được gọi là Tên hoặc ID được xác định.
Lớp Sinh viên triển khai giao diện GroovyInterceptable.
Có một tham số gọi là dynamicProps sẽ được sử dụng để giữ giá trị của các biến thành viên được tạo nhanh chóng.
Các phương thức getproperty và setproperty đã được triển khai để lấy và thiết lập các giá trị của thuộc tính của lớp trong thời gian chạy.
class Example {
static void main(String[] args) {
Student mst = new Student();
mst.Name = "Joe";
mst.ID = 1;
println(mst.Name);
println(mst.ID);
}
}
class Student implements GroovyInterceptable {
protected dynamicProps=[:]
void setProperty(String pName,val) {
dynamicProps[pName] = val
}
def getProperty(String pName) {
dynamicProps[pName]
}
}
Đầu ra của đoạn mã sau sẽ là:
Joe
1
Thiếu phương pháp
Vì vậy, hãy xem một ví dụ về cách chúng ta có thể triển khai Lập trình đối tượng Meta cho các Thuộc tính bị thiếu. Những điều quan trọng sau đây cần được lưu ý về mã sau:
Lớp Sinh viên bây giờ áp đặt phương thức invokeMethod được gọi bất kể phương thức đó có tồn tại hay không.
class Example {
static void main(String[] args) {
Student mst = new Student();
mst.Name = "Joe";
mst.ID = 1;
println(mst.Name);
println(mst.ID);
mst.AddMarks();
}
}
class Student implements GroovyInterceptable {
protected dynamicProps = [:]
void setProperty(String pName, val) {
dynamicProps[pName] = val
}
def getProperty(String pName) {
dynamicProps[pName]
}
def invokeMethod(String name, Object args) {
return "called invokeMethod $name $args"
}
}
Đầu ra của mã sau đây sẽ được hiển thị bên dưới. Lưu ý rằng không có lỗi thiếu Phương thức Ngoại lệ mặc dù Phương thức Hiển thị không tồn tại.
Joe
1
Metaclass
Chức năng này liên quan đến việc triển khai MetaClass. Trong triển khai mặc định, bạn có thể truy cập vào các trường mà không cần gọi getters và setters của chúng. Ví dụ sau đây cho thấy bằng cách sử dụng hàm metaClass, chúng ta có thể thay đổi giá trị của các biến private trong lớp.
class Example {
static void main(String[] args) {
Student mst = new Student();
println mst.getName()
mst.metaClass.setAttribute(mst, 'name', 'Mark')
println mst.getName()
}
}
class Student {
private String name = "Joe";
public String getName() {
return this.name;
}
}
Đầu ra của đoạn mã sau sẽ là:
Joe
Mark
Phương thức bị thiếu
Groovy ủng hộ khái niệm methodMissing. Phương thức này khác với invokeMethod ở chỗ nó chỉ được gọi trong trường hợp gửi phương thức không thành công, khi không thể tìm thấy phương thức nào cho tên đã cho và / hoặc các đối số đã cho. Ví dụ sau cho thấy cách methodMissing có thể được sử dụng.
class Example {
static void main(String[] args) {
Student mst = new Student();
mst.Name = "Joe";
mst.ID = 1;
println(mst.Name);
println(mst.ID);
mst.AddMarks();
}
}
class Student implements GroovyInterceptable {
protected dynamicProps = [:]
void setProperty(String pName, val) {
dynamicProps[pName] = val
}
def getProperty(String pName) {
dynamicProps[pName]
}
def methodMissing(String name, def args) {
println "Missing method"
}
}
Đầu ra của đoạn mã sau sẽ là:
Joe
1
Missing method