자바 반사 메커니즘 에 대한 간단 한 설명
먼저 여러분 은 먼저 두 가지 개념 을 이해 해 야 합 니 다.컴 파일 기간 과 운영 기간 은 컴 파일 러 가 소스 코드 를 기계 가 식별 할 수 있 는 코드 로 번역 하 는 것 입 니 다.예 를 들 어 컴 파일 러 는 자바 코드 를 jvm 이 식별 하 는 바이트 파일 로 컴 파일 하 는 것 입 니 다.운영 기 구 는 실행 가능 한 파일 을 운영 체제 에 맡 기 는 것 을 말 합 니 다.JAVA 반사 체 제 는 운행 상태 에서 임 의 한 가지 유형 에 대해이 종류의 모든 속성 과 방법 을 알 수 있다.임의의 대상 에 대해 서 는 임의의 방법 과 속성 을 호출 할 수 있 습 니 다.이러한 동적 획득 정보 및 동적 호출 대상 방법의 기능 을 자바 언어의 반사 메커니즘 이 라 고 한다.
쉽게 말 하면 반사 체 제 는 프로그램 이 실 행 될 때 자신의 정 보 를 얻 을 수 있 는 가치 가 있다.자바 에 서 는 주어진 클래스 의 이름 만 있 으 면 반사 체 제 를 통 해 클래스 의 모든 정 보 를 얻 을 수 있 습 니 다.
🌱2.자바 반사 체 제 는 어떤 기능 을 제공 합 니까?
new:정적 컴 파일,컴 파일 기간 에 모듈 을 컴 파일 하고 이 바이트 코드 파일 을 실행 하 며 모든 모듈 을 불 러 옵 니 다.
반사:동적 컴 파일,컴 파일 기간 에 불 러 오지 않 았 습 니 다.모듈 이 호출 될 때 까지 기 다 려 야 불 러 옵 니 다.
주:spring 의 ioc 는 반사 메커니즘 을 사용 하여 new Instance 를 만 듭 니 다.더욱 통용 되 고 결합 을 낮 추어 하 드 인 코딩 을 피 할 수 있 으 며 하나의 문자열 만 제공 하면 동적 으로 만 들 수 있 습 니 다.
String className = readfromXMlConfig;// xml
Class c = Class.forName(className);
factory = (AInterface)c.newInstance();
예:자전거 있어 요.🚲,소형 승용차🚗,
정적:출근 할 때 자전 거 를 차 에 넣 고 출근 해 야 합 니 다.꼭 가지 고 다 녀 야 합 니 다.하 나 를 놓 치면 안 됩 니 다.
동태:자전 거 를 집에 두 고 교통 이 막 혀 자전 거 를 타고 가 고 차 를 집에 두 세 요.
🌱4.어떻게 반 사 를 통 해 사유 대상 을 호출 합 니까?
Field[] declaredFields = clazz.getDeclaredFields();
for (Field f : declaredFields) {
System.out.println(" :" + f.getName());
System.out.println(" :" + f.getType().getName());
//
f.setAccessible(true);//
🌱5.어떻게 반사 호출 방법 을 통 해?
Method m = stuClass.getMethod("show1", String.class);
System.out.println(m);
// Student
Object obj = stuClass.getConstructor().newInstance();
m.invoke(obj, " ");
🌱6.class 클래스 의 일부 상용 방법 총화
package com.fjh;
public class Student {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student() {
System.out.println(" !");
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
package com.fjh;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectTest {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException,
SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
//
Student stu = new Student();
//
Student newInstance = Student.class.newInstance();
//
Class clazz = Student.class;
// Field field = clazz.getField("name");//
Field field = clazz.getDeclaredField("name");
System.out.println(" :" + field.getName());
System.out.println(" :" + field.getType().getName());
System.out.println("---------------------");
//
Field[] declaredFields = clazz.getDeclaredFields();
for (Field f : declaredFields) {
System.out.println(" :" + f.getName());
System.out.println(" :" + f.getType().getName());
//
f.setAccessible(true);//
if (int.class == f.getType()) {
f.set(newInstance, 50);
} else if (String.class == f.getType()) {
f.set(newInstance, " ");
}
}
System.out.println("======== ==========");
System.out.println(newInstance);
System.out.println("======== ==========");
//
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
String methodName = method.getName();//
int parameterCount = method.getParameterCount();//
System.out.println(" :" + methodName);
System.out.println(" :" + parameterCount);
Class<?>[] parameterTypes = method.getParameterTypes();
//
for (Class<?> class1 : parameterTypes) {
System.out.println(" :" + class1.getName());
}
//
Class<?> returnType = method.getReturnType();
System.out.println(" :" + returnType.getName());
System.out.println("-------------------");
}
//
// ,
// Method declaredMethod = clazz.getDeclaredMethod("setName", new
// Class[]{String.class,int.class});
//
// declaredMethod.invoke(newInstance,Object[]{"mayun",20} );
Method declaredMethod = clazz.getDeclaredMethod("setName", String.class);// Class 。
declaredMethod.invoke(newInstance, " ");
System.out.println("========== =========");
System.out.println(newInstance);
//
Constructor constructor = clazz.getConstructor(new Class[] { String.class, int.class });
//
Object obj = constructor.newInstance(new Object[] { " ", 46 });
System.out.println("========== =========");
System.out.println(obj);
System.out.println("========== =========");
//
Constructor[] constructors = clazz.getConstructors();
for (Constructor c : constructors) {
if(c.getParameterCount() != 0){
Class[] parameterTypes = c.getParameterTypes();
for (Class class1 : parameterTypes) {
System.out.println(" :"+class1.getTypeName());
}
System.out.println("-------------------");
}else{
System.out.println(" ");
System.out.println("-------------------");
}
}
}
}
🌱7.결과자바 반사 메커니즘 에 대한 간단 한 설명 이 있 는 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 반사 메커니즘 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.