Groovy - Pemrograman Objek Meta

Pemrograman objek meta atau MOP dapat digunakan untuk memanggil metode secara dinamis dan juga membuat kelas dan metode dengan cepat.

Jadi apa artinya ini? Mari kita pertimbangkan kelas yang disebut Mahasiswa, yang merupakan jenis kelas kosong tanpa variabel anggota atau metode. Misalkan jika Anda harus meminta pernyataan berikut di kelas ini.

Def myStudent = new Student() 
myStudent.Name = ”Joe”; 
myStudent.Display()

Sekarang dalam pemrograman objek meta, meskipun kelas tersebut tidak memiliki variabel anggota Nama atau metode Tampilan (), kode di atas akan tetap berfungsi.

Bagaimana cara kerjanya? Nah, agar ini berhasil, kita harus mengimplementasikan antarmuka GroovyInterceptable untuk menghubungkan ke proses eksekusi Groovy. Berikut adalah metode yang tersedia untuk antarmuka ini.

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) 
}

Jadi dalam deskripsi antarmuka di atas, misalkan jika Anda harus mengimplementasikan invokeMethod (), itu akan dipanggil untuk setiap metode yang ada atau tidak ada.

Properti Hilang

Jadi mari kita lihat contoh bagaimana kita dapat mengimplementasikan Pemrograman Objek Meta untuk Properti yang hilang. Hal-hal kunci berikut harus diperhatikan tentang kode berikut.

  • Siswa kelas tidak memiliki variabel anggota yang disebut Nama atau ID yang ditentukan.

  • Siswa kelas mengimplementasikan antarmuka GroovyInterceptable.

  • Ada parameter yang disebut dynamicProps yang akan digunakan untuk menyimpan nilai variabel anggota yang dibuat dengan cepat.

  • Metode getproperty dan setproperty telah diimplementasikan untuk mendapatkan dan menyetel nilai properti kelas pada waktu proses.

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]
   } 
}

Output dari kode berikut akan menjadi -

Joe 
1

Metode yang hilang

Jadi mari kita lihat contoh bagaimana kita dapat mengimplementasikan Pemrograman Objek Meta untuk Properti yang hilang. Hal-hal kunci berikut harus diperhatikan tentang kode berikut -

  • Siswa kelas sekarang mengimplementasikan metode invokeMethod yang dipanggil terlepas dari apakah metode itu ada atau tidak.

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"
   }
}

Output dari kode berikut akan ditampilkan di bawah ini. Perhatikan bahwa tidak ada kesalahan dari Pengecualian Metode meskipun metode Tampilan tidak ada.

Joe 
1

Metaclass

Fungsionalitas ini terkait dengan implementasi MetaClass. Dalam implementasi default, Anda dapat mengakses kolom tanpa memanggil getter dan setternya. Contoh berikut menunjukkan bagaimana dengan menggunakan fungsi metaClass kita dapat mengubah nilai variabel privat di kelas.

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;
   } 
}

Output dari kode berikut akan menjadi -

Joe 
Mark

Metode Hilang

Groovy mendukung konsep methodMissing. Metode ini berbeda dari invokeMethod karena hanya dipanggil jika ada metode pengiriman yang gagal, ketika tidak ada metode yang dapat ditemukan untuk nama yang diberikan dan / atau argumen yang diberikan. Contoh berikut menunjukkan bagaimana methodMissing dapat digunakan.

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"
   }  
}

Output dari kode berikut akan menjadi -

Joe 
1 
Missing method