2013-05-13 3 views
0

Reflection을 사용해도 JavaScript와 유사한 프로토 타이핑이 가능합니까? 원래의 비 사기성 메서드를 모두 래퍼 클래스에 연결하지 않고 하나 또는 두 개의 메서드로 기능을 확장하기 위해 다른 개체 내부에 객체를 래핑 할 수 있습니까? 아니면 extends을 얻을 수 있습니까?확장 대신 Java에서 프로토 타이핑

+0

난 당신이'클래스를 extend' 또는 어쩌면 [실내 장식]에 싸서 수 있다고 생각을 (http://en.wikipedia.org/wiki/Decorator_pattern) –

+1

당신이 할 수있는 동적 프록시 사용 y API ('java.lang.reflect.Proxy') 또는'cglib'과 같은 라이브러리를 사용하면 무엇을 하려는지 성취 할 수 있습니다. 그러나 모든 경우에'JavaScript'처럼 쉽지는 않을 것입니다. 'Java'의 리플렉션은 항상 프로토 타입 프로그래밍 세계에 익숙했을 때 큰 고통이었습니다! – Vadim

+0

나는 그 질문에 답을 넣을 수 있다고 생각합니다. –

답변

0

Java에서이 작업을 수행 할 수 있다고 생각하지 않습니다. 당신은 당신이 확장 방법을 찾고 있다면 metaclasses

String.metaClass.world = { 
    return delegate + " world!" 
} 

println "Hello".world() 
1

를 사용하지만 그루비 수, 당신은 Xtend을 시도 할 수 있습니다. Xtend는 Java 코드로 컴파일되고 상용구 코드를 제거하는 언어입니다.

다음 텍스트는 Xtend Docs for extensions 도난되어

필드를 확장 키워드를 추가하면, 로컬 변수 또는 매개 변수 선언 그 인스턴스 메소드 확장 방법이된다.

클래스 Person에 특정 레이어 기능을 추가한다고 가정 해 보겠습니다. 당신이 서블릿과 같은 클래스에 있고 일부 영속성 메커니즘을 사용하여 Person을 유지하려고한다고 가정 해 보겠습니다. Person이 공통 인터페이스 Entity를 구현한다고 가정 해 봅시다. 당신은

interface EntityPersistence { 
    public save(Entity e); 
    public update(Entity e); 
    public delete(Entity e); 
} 

다음과 같은 인터페이스

을 그리고 수이 같은 (공장 또는 의존성 주입 또는 무엇도를 통해) 해당 유형의 인스턴스를 획득 한 경우 :

당신은 절약 할 수 있습니다
class MyServlet { 
    extension EntityPersistence ep = Factory.get(typeof(EntityPersistence)) 
    ... 

} 

, 갱신과 같은 실체를 삭제합니다

val Person person = ... 
person.save // calls ep.save(person) 
person.name = 'Horst' 
person.update // calls ep.update(person) 
person.delete // calls ep.delete(person) 
관련 문제