홈>
다음 코드가있는 경우 :
class Person {
String getName() {
"John Doe"
}
boolean isMan() {
true
}
}
println new Person().properties
그런 다음 인쇄합니다 :
[class:class Person, man:true, name:John Doe]
그루비가 접근 자 메서드를 기반으로 속성 (사람, 이름)을 생성하지 못하게하려면 어떻게해야합니까? groovy가 속성을 생성하는 이유를 이해하지만 groovy가이를 수행하지 못하게하는 방법 (예 : 주석 사용)이있을 것으로 기대했습니다.
- 답변 # 1
관련 자료
- mongodb - {} 1 필드가 인쇄되지 않고 내부 값을 인쇄하지 못하게하는 방법이 있습니까?
- node.js - MongoDB에서 새 문서를 만들 때 특정 필드의 고유성을 보장하는 방법은 무엇입니까?
- python - Scapy Layer (체인 바이트)를 만들 때 확장 된 필드
- apache spark - pyspark - 1000 개의 필드가 있지만 가변 개수의 열이있는 스키마가있는 rdd-> df-> 나무 마루 만들기
- sql - 구문을 사용하여 MYSQL 테이블/정의 필드를 만드는 데 어려움이 있음
- node.js - 몽구스가 여러 필드에 대한 텍스트 인덱스를 만들지 않음
- database design - 노드 속성을 기반으로 새 관계 작성 금지
트렌드
- OpenCv의 폴더에서 여러 이미지 읽기 (python)
- 파이썬 셀레늄 모든 "href"속성 가져 오기
- html - 자바 스크립트 - 클릭 후 변경 버튼 텍스트 변경
- git commit - 자식 - 로컬 커밋 된 파일에 대한 변경을 취소하는 방법
- JSP에 대한 클래스를 컴파일 할 수 없습니다
- javascript - 현재 URL에서 특정 div 만 새로 고침/새로 고침
- jquery - JavaScript로 현재 세션 값을 얻으시겠습니까?
- javascript - swiperjs에서 정지, 재생 버튼 추가
- python - 문자열에서 특정 문자 제거
- JavaScript 변수를 HTML div에 '출력'하는 방법
new Person().properties
를 알고 있어야합니다 클래스 필드 측면에서 클래스 속성 목록을 반환하지 않고 메타 클래스 속성을 반환합니다. Groovy는MetaBeanProperty
라는 클래스를 사용합니다. -클래스 필드와 접근 자 메서드를 모두 나타냅니다. Groovy 클래스를 컴파일하면.class
를 얻을 수 있습니다 다음과 같이 디 컴파일되는 파일 :아시다시피 getter 메소드에 대해 작성된 파일이 없습니다. 그러나
new Person().properties
name
를 반환 그리고man
MetaBeanProperty
로 인해 속성 .클래스 필드의 맵만 가져 오려면
이 예에서는new Person().properties
가 반환 한 맵을 필터링해야합니다. . 와이즈 비즈 클래스는이 방법을MetaBeanProperty
그getField()
를 반환 주어진CachedField
클래스 필드와MetaBeanProperty
로 표시됩니다. 그렇지 않으면. 다음 예를 고려하십시오.import groovy.transform.CompileStatic import groovy.transform.TypeChecked @CompileStatic @TypeChecked class Person { String email String getName() { "John Doe" } boolean isMan() { true } static void main(String[] args) { def person = new Person() def fields = person.properties.findAll { (person.hasProperty(it.key.toString()) instanceof MetaBeanProperty) && ((MetaBeanProperty) person.hasProperty(it.key.toString())).getField() != null } println fields } }
필드를 추가했습니다 . 위에서 설명한 규칙에 따라 속성 목록을 필터링하면 다음 맵이 반환됩니다.마지막으로-이것이
[email:null]
를 수정 한 것입니다.Person
를 디 컴파일 한 후 클래스가 보였습니다. 파일 :다시,
클래스 속성은 어디에 생성됩니까?import Person._main_closure1; import groovy.lang.GroovyObject; import groovy.lang.MetaClass; import groovy.lang.Reference; import java.util.Map; import org.codehaus.groovy.runtime.DefaultGroovyMethods; public class Person implements GroovyObject { private String email; public Person() { MetaClass var1 = this.$getStaticMetaClass(); this.metaClass = var1; } public String getName() { return "John Doe"; } public boolean isMan() { return true; } public static void main(String... args) { Reference person = new Reference(new Person()); Map fields = DefaultGroovyMethods.findAll(DefaultGroovyMethods.getProperties((Person)person.get()), new _main_closure1(Person.class, Person.class, person)); DefaultGroovyMethods.println(Person.class, fields); Object var10000 = null; } public String getEmail() { return this.email; } public void setEmail(String var1) { this.email = var1; } }
그리고getName()
메소드는 클래스 필드를 작성하지 않습니다.isMan()
기본 Groovy 범위를 가진 필드는 접근 자 메소드를 사용하여 개인 클래스 필드로 변환됩니다. 도움이 되길 바랍니다.email
가있는 장소를 보거나 디버그하려는 경우 지도가 만들어졌습니다.new Person().properties
를보세요. 이것은 클래스 2083의 메소드입니다. 이것은 클래스가 메타 클래스에서 특성 목록을 가져 오기 위해 호출하는 메소드입니다. 보시다시피 캐시 된 필드 (실제 클래스 필드)와 메타 빈 속성 (필드 또는 접근 자 메서드로 표시 될 수있는 속성)의 두 가지 속성 유형을 허용합니다.MetaClassImpl.getProperties()
에서 getter 메소드를 검색하지 못하게하는 옵션이 없습니다. 불행히도 방법.getProperties()
에서 접근 자 메소드를 제외하려는 경우 그런 다음 이것을 달성하는 유일한 방법은 메소드의 이름을 바꾸어 접근 자 메소드로 표시되지 않는 것입니다 (예 :new Person().properties
->getName()
). 이 경우 Groovy의 메타 클래스는 그러한 메소드에 대한 메타 빈 특성을 검색하지 않으며 리턴하는 값은name()
에 존재하지 않습니다. 지도.new Person().properties