Java 학습의 반사 메커니즘 노트 --4

6348 단어
4. Java 반사 메커니즘 심도 있는 연구
1) 클래스를 반사하여 호출하는 방법
정상적인 상황에서 하나의 클래스의 대상이 생기면 이 클래스의 방법을 사용할 수 있다.호출하려면 호출할 방법 이름이 무엇인지 알아야 한다. 그 다음에 Class 클래스의 getMethod () 방법을 통해 Method 대상을 얻어서 Method 대상을 호출해서 이 방법을 실행해야 한다. 그러나 호출할 때 방법의 매개 변수 문제와 관련이 있기 때문에 getMethod를 통해 얻은 대상은 필요한 매개 변수 형식을 설정해야 한다.
package com.reflection.demo4;
import java.lang.reflect.Method ;
public class InvokeSayChinaDemo{
	public static void main(String args[]){
		Class> c1 = null ;
		try{
			c1 = Class.forName("com.reflection.demo4.Person") ;	//  Class 
		}catch(Exception e){}
		try{
			Method  met = c1.getMethod("sayChina") ;	//  sayChina() 
			met.invoke(c1.newInstance()) ;	//  
		}catch(Exception e){
			e.printStackTrace() ;
		}
	}
};

저자: 이흥화, 국적: 차이나
say China 방법을 호출합니다. 호출을 실행하는 것은 invoke 방법입니다. 실행할 때 매개 변수를 전달해야 하고 실례화 대상이 필요합니다.
호출할 방법에 파라미터가 있다면, 파라미터의 유형과 내용을 설정해야 한다
package com.reflection.demo4;
import java.lang.reflect.Method ;
public class InvokeSayHelloDemo{
	public static void main(String args[]){
		Class> c1 = null ;
		try{
			c1 = Class.forName("com.reflection.demo4.Person") ;	//  Class 
		}catch(Exception e){}
		try{
			Method  met = c1.getMethod("sayHello",String.class,int.class) ;	//  sayChina() 
			String rv = null ;
			rv = (String)met.invoke(c1.newInstance()," ",30) ;	//  
			System.out.println(rv) ;
		}catch(Exception e){
			e.printStackTrace() ;
		}
	}
};
이흥화, 안녕하세요!나 올해:30살이야!
2) 클래스의 setter와 Getter를 반사하여 호출
setter와 Getter는 표준적인 속성 접근 방법입니다. 만약 하나의 종류의 속성이 봉인된다면 setter와 Getter 방법을 통해 설정하고 얻어야 합니다. 실제로 이 방법의 조작이 이렇게 규정된 것은 반사 메커니즘이 지원하기 때문입니다.
반사를 통해 setter와 Getter를 호출할 수 있습니다
setter를 호출하려면, 예를 들어name 속성 설정, 즉 setName () 방법으로 쓰고, 방법의 두 번째 단어의 자모는 대문자로 써야 합니다.
package com.reflection.demo4;
import java.lang.reflect.Method ;
public class InvokeSetGetDemo{
	public static void main(String args[]){
		Class> c1 = null ;
		Object obj = null ;
		try{
			c1 = Class.forName("com.reflection.demo4.Person") ;	//  Class 
		}catch(Exception e){}
		try{
			obj = c1.newInstance() ;
		}catch(Exception e){}
		setter(obj,"name"," ",String.class) ;	//  setter 
		setter(obj,"age",30,int.class) ;	//  setter 
		System.out.print(" :") ;
		getter(obj,"name") ;
		System.out.print(" :") ;
		getter(obj,"age");
	}
	/**
		Object obj: 
		String att: 
		Object value: 
		Class> type: 
	*/
	public static void setter(Object obj,String att,Object value,Class> type){
		try{
			Method met = obj.getClass().getMethod("set"+initStr(att),type) ;	//  setter 
			met.invoke(obj,value) ;	//  setter 
		}catch(Exception e){
			e.printStackTrace() ;
		}
	}
	public static void getter(Object obj,String att){
		try{
			Method met = obj.getClass().getMethod("get"+initStr(att)) ;	//  setter 
			System.out.println(met.invoke(obj)) ;	//  getter 
		}catch(Exception e){
			e.printStackTrace() ;
		}
	}
	public static String initStr(String old){	//  
		String str = old.substring(0,1).toUpperCase() + old.substring(1) ;
		return str ;
	}
};
이름:이흥화
나이
3) 반사에 의한 조작 속성
클래스의 속성을 조작하려면 getField () 를 통해 완성할 수 있습니다
package com.reflection.demo4;
import java.lang.reflect.Field ;
public class InvokeFieldDemo{
	public static void main(String args[]) throws Exception{
		Class> c1 = null ;
		Object obj = null ;
		c1 = Class.forName("com.reflection.demo4.Person") ;	//  Class 
		obj = c1.newInstance() ;
		Field nameField = null ;
		Field ageField = null ;
		nameField = c1.getDeclaredField("name") ;	//  name 
		ageField = c1.getDeclaredField("age") ;	//  name 
		nameField.setAccessible(true) ;	//  
		ageField.setAccessible(true) ;	//  
		nameField.set(obj," ") ;	//  name 
		ageField.set(obj,3) ;			//  age 
		System.out.println(" :" + nameField.get(obj)) ;
		System.out.println(" :" + ageField.get(obj)) ;
	}
};

개인 속성에 접근할 때 속성을 보여야 합니다. 속성을 설정해야 합니다. - 속성.setAccessible(true)
4) 반사를 통한 배열 조작
반사는 클래스에만 적용되는 것이 아니라, 인용 데이터 형식에도 적용될 수 있습니다. 그룹을 포함하여, 그룹은 Array 클래스로 완성됩니다.
Class 클래스에 방법이 있습니다: getComponentType () 는 그룹을 되돌려줍니다.
배열에 의해 아래 첨자로 지정된 컨텐츠 Array.get(Object arr,int index)
배열 수정 아래 첨자의 컨텐트 Array 를 지정합니다.get(Object arr, int index) 새 배열 열기newInstance(Class> componentType, int length)
그룹 정보 가져오기 및 내용 수정
package com.reflection.demo4;
import java.lang.reflect.Array ;
public class ClassArrayDemo{
	public static void main(String args[]) throws Exception{
		int temp[] = {1,2,3} ;//  
		Class> c = temp.getClass().getComponentType() ;	//  Class 
		System.out.println(" :" + c.getName()) ;	//  
		System.out.println(" :" + Array.getLength(temp)) ;
		System.out.println(" :" + Array.get(temp,0)) ;
		Array.set(temp,0,6) ;
		System.out.println(" :" + Array.get(temp,0)) ;
	}
};
유형: int
길이
첫 번째 내용: 1
첫 번째 내용: 6
Array 클래스를 사용하여 배열 크기도 수정할 수 있습니다.
수정된 내용은 사실 새로운 공사를 개척하고, 또 낡은 내용을 새로운 수조로 복사하는 것이다
package com.reflection.demo4;


import java.lang.reflect.Array ;
public class ChangeArrayDemo{
	public static void main(String args[]) throws Exception{
		int temp[] = {1,2,3} ;//  
		int newTemp[] = (int []) arrayInc(temp,5) ;	//  5
		print(newTemp) ;
		System.out.println("
-------------------------") ; String t[] = {"hello","world","Java"} ; String nt[] = (String [])arrayInc(t,8) ; print(nt) ; } public static Object arrayInc(Object obj,int len){ Class> c = obj.getClass() ; Class> arr = c.getComponentType() ; // Class Object newO = Array.newInstance(arr,len) ; // , int co = Array.getLength(obj) ; System.arraycopy(obj,0,newO,0,co) ; // 0 return newO ; } public static void print(Object obj){ // Class> c = obj.getClass() ; if(!c.isArray()){ // return; } Class> arr = c.getComponentType() ; System.out.println(arr.getName()+" :" + Array.getLength(obj)) ; // for(int i=0;i
int수 그룹의 길이는:5
1、2、3、0、0、
-------------------------
java.lang.String 배열 길이: 8
hello、world、Java、null、null、null、null、null、

좋은 웹페이지 즐겨찾기