한 편의 글 이 너 를 데 리 고 JAVA 반 사 를 해결 해 줄 게.
1.개념
반사 란 운행 상태 에서 임의의 클래스 에 대해 이 클래스 의 모든 속성 과 방법 을 알 수 있 고 임의의 대상 에 대해 임의의 방법 을 호출 할 수 있다 는 것 을 말한다.이러한 동적 으로 정 보 를 얻 고 대상 방법 을 동적 으로 호출 하 는 기능 을 자바 언어의 반사 메커니즘 이 라 고 합 니 다.반사 가 강하 고 장점 도 있 고 단점 도 있다.
장점:유연성 이 높다.반 사 는 동적 컴 파일 에 속 하기 때문에 실행 할 때 만 동적 생 성&대상 인 스 턴 스 를 가 져 옵 니 다.
단점:집행 효율 이 낮다.
2.바이트 파일 대상 가 져 오 는 방법
2.1 메타 데이터 의 개념
메타 데이터(metadata):메타 데 이 터 는 클래스 를 설명 하 는 데 사용 되 는 데 이 터 를 말 합 니 다.바로 class 의 코드 데이터 입 니 다.모든 class 파일 을 가상 컴퓨터 에 불 러 오 면 class 대상 으로 구 축 됩 니 다.class 대상 은 어떤 것들 이 있 는 지 설명 합 니 다.모두 가 알 고 있 는 실현 인터페이스,계승 하 는 추상 류,구성원 변수,클래스 변수,구성원 방법,클래스 방법,정적 방법 등 이 있 습 니 다.이 class 대상 은 메타 데이터 입 니 다.
클래스 클래스:한 클래스 를 대표 합 니 다
2.2 클 라 스 대상 을 가 져 오 는 방법
package org.pdool.reflect;
/**
* @author
*/
public class Npc {
// field
public static int NPC_TYPE_1 = 1;
//
private int npcType;
//
public String name;
//
public Npc() {
}
//
public Npc(int npcType, String name) {
this.npcType = npcType;
this.name = name;
}
public int getNpcType() {
return npcType;
}
public void setNpcType(int npcType) {
this.npcType = npcType;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//
public static void sayHello(String word){
System.out.println("hello " + word);
}
}
반사 클 라 스 를 가 져 오 는 세 가지 방식
package org.pdool.reflect;
/**
* @author
*/
public class ClazzTest {
public static void main(String[] args) {
// Class
Npc npc1 = new Npc();// new Npc , Class 。
Class npcClazz1 = npc1.getClass();// Class
System.out.println(npcClazz1.getName());
// Class
Class npcClazz2 = Npc.class;
System.out.println(npcClazz1 == npcClazz2);// Class
// Class
try {
Class npcClazz3 = Class.forName("org.pdool.reflect.Npc");// , , .
System.out.println(npcClazz3 == npcClazz2);// Class
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
1.접근 권한반사 메커니즘 의 기본 행 위 는 자바 의 접근 제어 에 제한 을 받 아 setAccessible 을 통 해 제어 할 수 있 습 니 다.
//
static void setAccessible(AccessibleObject[] array, boolean flag)
2.획득 방법2.1 정적 접근 방법
public static void main(String[] args) throws NoSuchMethodException,InvocationTargetException, IllegalAccessException {
Npc npc = new Npc(1, " ・ ");
Class npcClazz = Npc.class;
// , class , ,
Method sayHello = npcClazz.getMethod("sayHello", String.class);
sayHello.invoke(npc, "world");
}
2.2 액세스 클래스 방법
Npc npc = new Npc(1, " ・ ");
System.out.println(npc.getName());
Class npcClazz = Npc.class;
// , class , ,
Method sayHello = npcClazz.getMethod("setName", String.class);
sayHello.invoke(npc, "world");
System.out.println(npc.getName());
3.필드 가 져 오기,필드 값 읽 기
Npc npc = new Npc(1, " ・ ");
Class npcClazz = Npc.class;
// ,
Field field = npcClazz.getField("name");
field.setAccessible(true);
System.out.println( field.get(npc));
4.실현 되 는 인터페이스 가 져 오기5.구조 함수 가 져 오기,인 스 턴 스 생 성
Class npcClazz = Npc.class;
Constructor declaredConstructor = npcClazz.getDeclaredConstructor(int.class,String.class);
Npc npc = (Npc) declaredConstructor.newInstance(1, " ");
System.out.println(npc.getName());
6.상속 한 부류 획득
Class npcClazz = Npc.class;
Class superclass = npcClazz.getSuperclass();
System.out.println(superclass.getName());
7.주석 가 져 오기
Class npcClazz = Npc.class;
Annotation[] annotations = npcClazz.getAnnotations();
//
for (Annotation annotation : annotations) {
System.out.println(annotation.getClass().getName());
}
4.반사 사례메타 데 이 터 를 가 져 오 는 것 은 최종 목적 이 아 닙 니 다.저희 의 최종 목적 은 실행 할 때'접근 클래스'를 호출 하 는 것 입 니 다.너무 많은 말 을 했 습 니까?아니면 예 를 들 어 Spring 의 IOC 가 어떻게 이 루어 졌 는 지 아 세 요?
프로 세 스:
1.Spring 은 프로젝트 시작 시간 에 xml 에 설 정 된 bean 의 경 로 를 읽 습 니 다.
2.그리고 class.forName 을 통 해 클래스 로 더 를 읽 습 니 다.
3.그리고 반사 로 모든 bean 인 스 턴 스 를 만 들 고 용기 에 저장 하 며 용 기 를 시작 한 후,
4.프로젝트 에서 bean 대상 을 직접 얻 을 수 있 습 니 다.
xml 읽 기 가 귀 찮 기 때문에 property 로 대체 합 니 다.모두 가 사상 을 체득 하면 된다.
package org.pdool.reflect;
import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
/**
* @author
*/
public class ClazzTest {
public static void main(String[] args){
try {
Map<String,Object> container = new HashMap<>();
//1.
InputStream in = ClazzTest.class.getResourceAsStream("/beans.properties");
Properties property = new Properties();
property.load(in);
//2.
Set<Object> keySet = property.keySet();
for (Object key : keySet) {
// 2.1
String classStr = (String) property.get(key);
// 2.2 class
Class<?> beanClazz = Class.forName(classStr);
// 2.3
Constructor<?> declaredConstructor = beanClazz.getDeclaredConstructor();
// 2.4
Object o = declaredConstructor.newInstance();
container.put((String) key,o);
}
// 3.
Npc npc = (Npc) container.get("npc");
System.out.println(npc == null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
5.총화자바 반사 체 제 를 사용 할 때 주요 절 차 는 다음 과 같다.
대상 형식의 Class 대상 가 져 오기
Class 대상 을 통 해 Constructor 클래스 대상,Method 클래스 대상 또는 Field 클래스 대상 을 각각 가 져 옵 니 다.
Constructor 클래스 대상,Method 클래스 대상&Field 클래스 대상 을 통 해 클래스 의 구조 함수,방법&속성의 구체 적 인 정 보 를 얻 고 후속 작업 을 진행 합 니 다.
이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 실 수 있 기 를 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA 객체 작성 및 제거 방법정적 공장 방법 정적 공장 방법의 장점 를 반환할 수 있습니다. 정적 공장 방법의 단점 류 공유되거나 보호된 구조기를 포함하지 않으면 이불류화할 수 없음 여러 개의 구조기 파라미터를 만났을 때 구축기를 고려해야 한다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.