Java 학습의 반사 메커니즘 노트 --4
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수 그룹의 길이는:51、2、3、0、0、
-------------------------
java.lang.String 배열 길이: 8
hello、world、Java、null、null、null、null、null、
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.