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