클래스에 접근자를 제공하는 것이 좋거나 나쁜 OO 관행이라면 반사 성능 (메모리 소비 또는 CPU 시간)을 통해 객체의 특정 속성에 대한 액세스를 실행하고 있는지 알고 싶습니다.리플렉션을 사용하여 Java 클래스의 접근자를 구현하면 얼마나 성능이 저하됩니까?
이것을 구현하고 벤치 마크를 수행 했습니까? 벤치 마크를 수행 한 사람에 대해 알고 계십니까?
편집 :
때문에이 성능 저하가 나는 질문의 제목을 수정 한 분명 있음을 나타냅니다 일부 의견에 내가 구현하는 접근의 영향이 얼마나 나쁜 알고 싶습니다 나타냅니다 리플렉션과 함께.
편집 :
감사합니다. 친절한 댓글과 답변을 해주셔서 감사합니다.
package co.com.prueba.reflection;
import java.lang.reflect.Field;
public class A {
private String s;
public void setS(String s){
this.s=s;
}
public String getS(){
return this.s;
}
public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {
System.out.println("Invoking .setAccesible(true) ...");
A secondA = new A();
for(int i=0; i<10; i++){
long start = System.nanoTime();
Field f = secondA.getClass().getDeclaredField("s");
f.setAccessible(true);
f.get(secondA);
long end = System.nanoTime();
System.out.println((end - start));
}
System.out.println("Without invoking .setAccesible(true) ...");
A firstA = new A();
for(int i=0; i<10; i++){
long start = System.nanoTime();
Field f = firstA.getClass().getDeclaredField("s");
f.get(firstA);
long end = System.nanoTime();
System.out.println((end - start));
}
System.out.println("Invoking the getter ...");
A thirdA = new A();
for(int i=0; i<10; i++){
long start = System.nanoTime();
thirdA.getS();
long end = System.nanoTime();
System.out.println((end - start));
}
}
}
여기있습니다 : @ 피터 Lawrey 및 @EJP의 종류 주석의 답변에 따라이 내가 의미하고 어떤 전에 내 질문에 구현 한 경우 알고 싶어 무엇인가 결과 :
여러분 모두 감사드립니다.
반사가 항상 느립니다. – SLaks
물론 변수에 액세스하는 것보다 속도가 느리고 무겁습니다.그리고 컴파일이 액세스의 일관성을 확인하지 않는다는 것과 같은 많은 다른 문제가 발생합니다. –
정확히 무슨 뜻입니까? 접근 자 (getter 및 setters)는 리플렉션이 아닙니다. – Henry