Groovy-메타 개체 프로그래밍

메타 개체 프로그래밍 또는 MOP를 사용하여 메서드를 동적으로 호출하고 즉시 클래스와 메서드를 만들 수 있습니다.

이것은 무엇을 의미합니까? 멤버 변수 나 메서드가없는 일종의 빈 클래스 인 Student라는 클래스를 생각해 봅시다. 이 클래스에서 다음 명령문을 호출해야한다고 가정하십시오.

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

이제 메타 개체 프로그래밍에서 클래스에 멤버 변수 Name 또는 Display () 메서드가 없더라도 위 코드는 계속 작동합니다.

어떻게 작동 할 수 있습니까? 이 문제가 해결 되려면 Groovy의 실행 프로세스에 연결하기 위해 GroovyInterceptable 인터페이스를 구현해야합니다. 다음은이 인터페이스에 사용할 수있는 방법입니다.

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

따라서 위의 인터페이스 설명에서 invokeMethod ()를 구현해야한다면 존재하거나 존재하지 않는 모든 메서드에 대해 호출된다고 가정합니다.

누락 된 속성

이제 누락 된 속성에 대해 메타 개체 프로그래밍을 구현할 수있는 방법의 예를 살펴 보겠습니다. 다음 코드에 대해 다음 키에주의해야합니다.

  • Student 클래스에는 Name 또는 ID라는 멤버 변수가 정의되어 있지 않습니다.

  • Student 클래스는 GroovyInterceptable 인터페이스를 구현합니다.

  • 즉석에서 생성되는 멤버 변수의 값을 보유하는 데 사용되는 dynamicProps라는 매개 변수가 있습니다.

  • getproperty 및 setproperty 메소드는 런타임에 클래스의 속성 값을 가져오고 설정하기 위해 구현되었습니다.

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

다음 코드의 출력은-

Joe 
1

누락 된 방법

이제 누락 된 속성에 대해 메타 개체 프로그래밍을 구현할 수있는 방법의 예를 살펴 보겠습니다. 다음 키는 다음 코드에 대해주의해야합니다.

  • 이제 Student 클래스는 메서드의 존재 여부에 관계없이 호출되는 invokeMethod 메서드를 구현합니다.

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

다음 코드의 출력은 아래와 같습니다. 메서드 Display가 존재하지 않더라도 메서드 예외 누락 오류는 없습니다.

Joe 
1

메타 클래스

이 기능은 MetaClass 구현과 관련이 있습니다. 기본 구현에서는 getter 및 setter를 호출하지 않고도 필드에 액세스 할 수 있습니다. 다음 예제는 metaClass 함수를 사용하여 클래스의 개인 변수 값을 변경할 수있는 방법을 보여줍니다.

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

다음 코드의 출력은-

Joe 
Mark

방법 누락

Groovy는 methodMissing의 개념을 지원합니다. 이 메소드는 지정된 이름 및 / 또는 지정된 인수에 대한 메소드를 찾을 수없는 경우 실패한 메소드 디스패치의 경우에만 호출된다는 점에서 invokeMethod와 다릅니다. 다음 예제는 methodMissing을 사용하는 방법을 보여줍니다.

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

다음 코드의 출력은-

Joe 
1 
Missing method