클래스리플렉션데모
다음과 같이 코드 코드를 복사합니다 .
패키지 반사;
@더 이상 사용되지 않음
공개 클래스 ReflectionDemo {
개인 문자열 pri_field;
공개 문자열 pub_field;
공개 반사데모(){}
공개 ReflectionDemo(문자열 이름){}
private ReflectionDemo(문자열 이름,int int1){}
공개 무효 ReflectMethod(){}
공개 무효 ReflectMethod(문자열 str){}
개인 무효 ReflectMethod(int int1){}
클래스 innerclss_Refection{}
}
테스트 클래스ReflectionDemoTest
다음과 같이 코드 코드를 복사합니다 .
패키지 반사;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
공개 클래스 ReflectionDemoTest {
공개 정적 무효 메인(String[] args) {
//강제 전송을 피하기 위해 클래스 객체를 생성하고 일반 수정을 사용합니다.
클래스 cla=ReflectionDemo.class;
//모든 공개 필드를 가져오는 방법
필드[] 필드=cla.getFields();
for(필드 f:필드){
System.out.println("모든 공개 필드를 가져오는 방법:"+f.toString());
}
//지정된 공개 도메인을 얻는 방법
노력하다 {
필드 field1=cla.getField("pub_field");
System.out.println("지정된 공개 필드를 가져오는 방법:"+field1.toString());
} 잡기(SecurityException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
} 잡기(NoSuchFieldException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
//모든 도메인(프라이빗 도메인 포함)을 획득하는 방법, 선언
Field[] field2=cla.getDeclaredFields();
for(필드 f:필드2){
System.out.println("모든 필드(개인 필드 포함)를 얻는 방법:"+f.toString());
}
//지정된 도메인(개인 도메인 포함)을 가져오는 메서드
노력하다 {
필드 field3=cla.getDeclaredField("pri_field");
System.out.println("지정된 필드(개인 필드 포함)를 가져오는 방법:"+field3.toString());
} 잡기(SecurityException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
} 잡기(NoSuchFieldException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
//모든 공개 메서드 가져오기(상위 클래스 포함)
메소드[] 메소드=cla.getMethods();
for(방법 m:방법){
System.out.println("모든 공용 메소드 가져오기:"+m.toString());
}
노력하다 {
//지정된 매개변수 없는 메서드를 가져옵니다.
//두 번째 매개변수는 매개변수 유형을 나타내고, 매개변수 NUll은 매개변수 없는 메소드를 나타냅니다.
메소드 method1=cla.getMethod("ReflectMethod", null);
System.out.println("매개변수 없이 공용 메소드의 메소드를 가져옵니다:"+method1.toString());
} 잡기(SecurityException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
} 잡기(NoSuchMethodException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
//이 클래스의 모든 메서드를 가져오는 메서드(부모 클래스 제외)
메소드[] 메소드2=cla.getDeclaredMethods();
for(메서드 m:메소드2){
System.out.println("모든 메서드 가져오기(상위 클래스 포함):"+m.toString());
}
//이 클래스의 지정된 메소드의 메소드를 가져옵니다(부모 클래스 제외).
//첫 번째 매개변수는 메소드 이름, 두 번째 매개변수는 메소드 반환 유형, NULL은 매개변수가 없는 메소드입니다.
노력하다 {
메소드 method3=cla.getDeclaredMethod("ReflectMethod",int.class);
System.out.println("이 클래스의 지정된 메소드의 메소드를 가져옵니다(상위 클래스 제외):"+method3);
} 잡기(SecurityException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
} 잡기(NoSuchMethodException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
//공개 생성자를 가져옵니다.
//매개변수 없이 공개 생성자를 가져옵니다.
노력하다 {
생성자 cs=cla.getConstructor(null);
System.out.println("매개변수 없는 생성자를 가져옵니다:"+cs);
} 잡기(SecurityException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
} 잡기(NoSuchMethodException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
//매개변수를 사용하여 공용 생성자를 가져옵니다.
//여러 매개변수를 갖는 생성자가 있는 경우에는 순서에 주의하세요.
노력하다 {
생성자 cs=cla.getConstructor(String.class);
System.out.println("매개변수화된 생성자를 가져옵니다:"+cs);
} 잡기(SecurityException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
} 잡기(NoSuchMethodException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
//모든 구성 메소드를 가져옵니다.
노력하다 {
생성자[] cs=cla.getDeclaredConstructors();
for(생성자 c:cs){
System.out.println("모든 생성 방법을 가져옵니다:"+c);
}
} 잡기(SecurityException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
//패키지명 알아내기
패키지 팩=cla.getPackage();
System.out.println("현재 패키지 이름을 가져옵니다:"+pack);
//댓글 가져오기
주석[] ann=cla.getAnnotations();
for(주석 an:ann){
System.out.println(an.toString());
}
//부모클래스를 구함
클래스 supercla=cla.getSuperclass();
System.out.println(supercla);
//내부 클래스 가져오기
클래스[] innercla=cla.getDeclaredClasses();
for(클래스 cl:innercla){
System.out.println(cl);
}
}
}
요약: 클래스 객체에 대한 정보를 얻는 단계:
1. 클래스 객체를 생성합니다. 방법 1 클래스 cla=Class.forName(“PATH”) 방법 2 CLass cla=Instance.getclass() 방법 3 클래스 cla=Class.class
2. cla.getXXXX 메소드를 호출하여 필드, 메소드, 생성자, 패키지 및 주석을 사용하여 관련 정보를 얻습니다.
3. 상위 클래스와 내부 클래스를 얻는 방법은 약간 다릅니다.
4. cla.getMethods를 사용하면 해당 클래스와 상위 클래스의 모든 공개 메소드가 호출됩니다.
5. Declared를 사용하면 private 메소드를 포함한 클래스의 모든 메소드가 호출됩니다. 도메인 및 생성자에도 동일하게 적용됩니다.
6. 리플렉션 클래스에 공개 생성자가 없고 newInstance 메서드를 직접 사용할 수 없는 경우 다음을 사용합니다.
메소드 cs=cla.getMethod("getInstance",null);//메소드 가져오기
Calendar Calendar=(Calendar) cs.invoke(cla, null);//얻은 메소드를 실행합니다. 매개변수 1은 실행 메소드의 객체이고 매개변수 2는 메소드의 매개변수를 나타냅니다.
날짜 df=calendar.getTime();
System.out.println(df.toString());
얻기 위해.