Java 반사 메커니즘 상세 및 실례
반사, 당시에 그들의 말을 자주 들었는데 자신도 일부 자료를 보았고 디자인 모델에서 사용한 적이 있을 수도 있지만 그것에 대해 깊은 이해가 없는 것 같아서 이번에 다시 공부했는데 괜찮은 것 같아요!
첫째, 반사의 개념을 살펴보자.
주로 프로그램이 그 자체의 상태나 행위를 방문하고 검측하고 수정할 수 있는 능력을 가리키며 자신의 행위의 상태와 결과에 따라 응용 프로그램이 기술한 행위의 상태와 관련 의미를 조정하거나 수정할 수 있다.
반사는 Java에서 강력한 도구로 유연한 코드를 쉽게 만들 수 있습니다. 이 코드들은 다시 실행할 때 조립할 수 있고 구성 요소 간에 원본 코드 링크를 할 필요가 없습니다.하지만 반사 사용이 부적절하면 비용이 높아요!
개념이 어지러워서 계속 내려다보세요.
둘째, 반사 메커니즘의 역할:
1, 역번역:.class-->.Java
2, 반사 메커니즘을 통해 자바 대상의 속성, 방법, 구조 방법 등에 접근한다.
이렇게 하면 좀 더 이해하기 쉬울 것 같다. 아래에서 우리는 어떻게 이런 기능을 실현하는지 구체적으로 보자.
셋째, 여기서 먼저 선이 우리에게 반사 메커니즘의 종류를 제공했다.
java.lang.Class;
java.lang.reflect.Constructor; java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
많은 반사 중의 방법, 속성 등 조작을 우리는 이 네 가지 종류에서 조회할 수 있다.아니면 끊임없는 검색 API를 배워야 할지 그게 우리 최고의 선생님입니다.넷째, 구체적인 기능 실현:
1, 반사 메커니즘 획득 클래스는 세 가지 방법이 있는데, 우리는Employee 유형을 얻는다
// :
Classc1 = Class.forName("Employee");
// :
//java class .
Classc2 = Employee.class;
// :
//java java getClass
Employeee = new Employee();
Classc3 = e.getClass(); //c3 (e Employee)
2, 객체 만들기: 클래스를 가져오면 newInstance를 사용하여 객체를 만듭니다.
Class c =Class.forName("Employee");
// Class
Objecto = c.newInstance(); // Employee .
3, 속성 획득: 모든 속성과 지정된 속성으로 나뉩니다.a, 먼저 모든 속성을 가져오는 방법을 보십시오.
//
Class c = Class.forName("java.lang.Integer");
// ?
Field[] fs = c.getDeclaredFields();
// ,
StringBuffer sb = new StringBuffer();
// ,
// public
sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{
");
//
for(Field field:fs){
sb.append("\t");//
sb.append(Modifier.toString(field.getModifiers())+" ");// , public,static
sb.append(field.getType().getSimpleName() + " ");//
sb.append(field.getName()+";
");// +
}
sb.append("}");
System.out.println(sb);
b, 특정한 속성을 얻고 전통적인 방법을 비교하여 학습한다.
public static void main(String[] args) throws Exception{
<span style="white-space:pre"> </span>// :
/*
User u = new User();
u.age = 12; //set
System.out.println(u.age); //get
*/
//
Class c = Class.forName("User");
// id
Field idF = c.getDeclaredField("id");
// o
Object o = c.newInstance();
//
idF.setAccessible(true); // , java 。
// o id "110"
idF.set(o, "110"); //set
//get
System.out.println(idF.get(o));
}
4, 획득 방법과 구조 방법은 더 이상 상세하게 설명하지 않고 키워드만 보십시오.방법 키워드
함의
getDeclaredMethods()
모든 방법 가져오기
getReturnType()
획득 방법의 반환 유형
getParameterTypes()
획득 방법의 전송 매개 변수 형식
getDeclaredMethod(메서드 이름, 매개변수 유형.class,...)
특정한 방법을 얻다
구조 방법 키워드
함의
getDeclaredConstructors()
모든 구조 방법 가져오기
getDeclaredConstructor(매개변수 유형.class,...)
특정 구조 방법 가져오기
상위 클래스 및 상위 인터페이스
함의
getSuperclass()
클래스의 상위 클래스 가져오기
getInterfaces()
어떤 종류의 실현된 인터페이스를 가져오다
이렇게 하면 우리는 유형의 각종 내용을 얻을 수 있고 반번역을 진행할 수 있다.JAVA와 같은 먼저 컴파일하고 실행하는 언어에 있어서 반사 메커니즘은 코드를 더욱 유연하게 하고 대상을 대상으로 하는 것을 더욱 쉽게 실현할 수 있다.
다섯째, 반사와 프로필을 추가하여 프로그램을 더욱 유연하게 합니다.
디자인 모델 학습에서 추상적인 공장을 배울 때 반사로 데이터베이스 링크 문자열을 더욱 편리하게 읽는 등 당시에는 그다지 이해하지 못하고 그대로 베꼈다.봐봐.NET의 반사 + 구성 파일 사용:
당시 사용한 프로필은 app입니다.config 파일, 내용은 XML 형식이고 안에 링크된 데이터베이스의 내용을 기입합니다.
<configuration>
lt;appSettings>
<add key="" value=""/>
lt;/appSettings>
</configuration>
반사된 쓰기 방법:
assembly.load(" ").CreateInstance(" ". );
이러한 장점은 우리가 데이터베이스를 쉽게 바꾸는 데 편리하다는 것이다. 예를 들어 우리가 시스템의 데이터베이스를 SQL Server에서 Oracle로 업그레이드하면 우리는 D층을 두 부 쓰고 프로필의 내용을 바꾸거나 조건을 붙여 선택하면 매우 큰 편리를 가져올 수 있다. 물론 JAVA에서도 마찬가지입니다. 단지 이곳의 프로필은.properties, 속성 파일이라고 합니다.반사를 통해 안의 내용을 읽다.이렇게 코드는 고정되어 있지만, 프로필의 내용을 우리는 고칠 수 있으며, 이렇게 하면 우리의 코드를 매우 유연하게 할 수 있다.
요약하면 JAVA의 반사적인 재학습은 이를 유연하게 활용하면 우리의 코드를 더욱 유연하게 할 수 있지만 그 단점도 있다. 바로 이를 활용하면 우리의 소프트웨어의 성능을 떨어뜨리고 복잡도를 증가시킬 수 있기 때문에 신중하게 사용해야 한다는 것이다.
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.