자바 반사 메커니즘 에 대한 간단 한 설명

🌱1.반사 메커니즘 은 무엇 입 니까?
먼저 여러분 은 먼저 두 가지 개념 을 이해 해 야 합 니 다.컴 파일 기간 과 운영 기간 은 컴 파일 러 가 소스 코드 를 기계 가 식별 할 수 있 는 코드 로 번역 하 는 것 입 니 다.예 를 들 어 컴 파일 러 는 자바 코드 를 jvm 이 식별 하 는 바이트 파일 로 컴 파일 하 는 것 입 니 다.운영 기 구 는 실행 가능 한 파일 을 운영 체제 에 맡 기 는 것 을 말 합 니 다.JAVA 반사 체 제 는 운행 상태 에서 임 의 한 가지 유형 에 대해이 종류의 모든 속성 과 방법 을 알 수 있다.임의의 대상 에 대해 서 는 임의의 방법 과 속성 을 호출 할 수 있 습 니 다.이러한 동적 획득 정보 및 동적 호출 대상 방법의 기능 을 자바 언어의 반사 메커니즘 이 라 고 한다.
쉽게 말 하면 반사 체 제 는 프로그램 이 실 행 될 때 자신의 정 보 를 얻 을 수 있 는 가치 가 있다.자바 에 서 는 주어진 클래스 의 이름 만 있 으 면 반사 체 제 를 통 해 클래스 의 모든 정 보 를 얻 을 수 있 습 니 다.
🌱2.자바 반사 체 제 는 어떤 기능 을 제공 합 니까?
  • 운행 할 때 임의의 대상 이 속 한 종 류 를 판단 할 수 있다
  • 4.567917.운행 시 임 의 유형 을 구성 하 는 대상4.567917.실행 할 때 임의의 클래스 가 가지 고 있 는 구성원 변수 와 방법 을 판단 합 니 다4.567917.실행 할 때 모든 대상 을 호출 하 는 방법
  • 실행 할 때 새로운 대상 을 만 듭 니 다
  • 🌱3.new 와 반사 생 성 은 어떤 차이 가 있 습 니까?
    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 클래스 의 일부 상용 방법 총화
  • 공공 구조 기 getConstructors()가 져 오기
  • 모든 구조 기 getDeclared Constructors 가 져 오기
  • 포 함 된 방법 getMethod()를 얻 습 니 다
  • 포 함 된 속성 getField(String name)가 져 오기
  • 내부 클래스 getDeclaredClasses 가 져 오기()외부 클래스 getDeclaringClass 가 져 오기()
  • 실 현 된 인터페이스 getInterfaces()를 가 져 옵 니 다
  • 수정자 getModifiers()가 져 오기
  • 패키지 getPackage()를 가 져 옵 니 다
  • 패키지 경 로 를 포함 하 는 클래스 이름 가 져 오기 getName()
  • 자바 반사 간단 한 프 리 젠 테 이 션
    
    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.결과
    在这里插入图片描述
    在这里插入图片描述
    자바 반사 메커니즘 에 대한 간단 한 설명 이 있 는 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 반사 메커니즘 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기