2012-02-19 2 views
6

PHP에서 __call 같이있는 것처럼 Java에서 마법 메서드를 사용하는 방법이 있습니까? 예를 들어마법으로 Java에서 메서드 호출

:

class foo { 
    @Setter @Getter 
    int id; 

    @Getter 
    Map <String, ClassInFoo> myMap; 

    protected class ClassInFoo { 
      @Setter @Getter 
      String name; 
    } 

    @Setter 
    String defaultKey; 
} 

내가 코드를 단순화하기 위해 getter와 setter 메소드에 대한 Project Lombok 주석을 사용하고 있습니다.

내지도에 String으로 매핑 된 여러 항목이 포함되어 있으며 defaultKey가 기본 항목을 정의한다고 가정 해 보겠습니다.

foo.myMap.get(defaultKey).getName()으로 기본 이름을 반환하는 foo.getName()을 호출 할 수 있습니다.

필자가 모든 getter를 수동으로 작성할 수없는 이유는 Foo 클래스가 사실 generics로 상속되었고 내부 클래스가 다를 수 있기 때문입니다.

function Object __call(method) { 
      if (exist_method(this.method) 
       return this.method(); 
      else 
       return this.myMap.get(defaultKey).method(); 
    } 

자바에서 어떻게 든 가능한 이것이다 :

나는 종류의 같은 것이 필요합니까?

편집 : https://gist.github.com/1864457

이 일을하는 유일한 이유는 내부 클래스에 "속기"방법입니다 :

내가 여기 달성하기 위해 노력하고 무엇보다 정확한 예를했다.

+0

흥미로운 질문으로 Upvoting지만,이 OOP 태그를해서는 안됩니다. 관심있는 기능은 객체 지향이 아니며 실제로 동적 일 필요는 없습니다. – Perception

+1

일반적으로 IDE로 생성 할 수있는 getter 및 setter가 필요합니다. 예를 들어 getter가 가변 컬렉션을 반환하는 것은 좋지 않습니다. 대신에'ClassInFoo getMyMap (String name)'을 가질 수 있습니다. –

+0

네, 모든 게터를 쓸 수는 있지만, 중복되고 추한 것을 발견했습니다. HTML 코딩 담당자가이 방법을 간단하게 요청할 수 있도록이 기능을 사용하고 싶습니다. –

답변

5

당신은 절대적으로 할 수있는 클래스가 가지고 있는지 확인하는 데 사용할 수 있습니다

public Method getMethod(String name, Class<?>... parameterTypes) 

처럼 그 특징을 이용하여 reflection을 통해 정의 된 몇 가지 방법이 있지만 적절한 사용으로 문제를 해결할 수 없다는 것을 알지 못합니다. F 인터페이스, 상속 및 방법 반사와 같은

특징의 최우선은 특정 그렇지 않으면 해결할 수없는 문제를 관리하기 위해 제공하지만이 철학의에없는 때문에 당신이, 가능하면 그것을 사용하지 않는 것을 시도해야한다, 그래서 자바는 PHP 아니다된다 언어.

+0

을 읽어 보면이 문제를 해결하는 데 도움이되었습니다. 감사! –

2

상속과 오버라이드의 핵심이 아닌가?

기본 클래스 :

public Object foo() { 
    return this.myMap.get(defaultKey).method(); 
} 

서브 클래스 :

@Overrides 
public Object foo() { 
    return whateverIWant; 
} 
+0

나는보다 정확한 예를 여기에 만들었습니다 : https://gist.github.com/1864457 - 제안을 좀더 자세히 설명해 주시겠습니까? 감사. –

+0

Fruit 클래스의 getName() 메서드가 이와 같이 구현되면 예상대로 작동합니다. getContents(). get (getDefaultKey()). getName(). 상속과 무효화 작업을 어떻게 이해하고 있습니까? http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html –