반사로 클래스 정보 학습 노트 보기

4251 단어 리플렉스Class
1. 자바 프로그램에서 많은 대상이 실행할 때 두 가지 유형이 나타난다. 그것이 바로 컴파일할 때 유형과 실행할 때 유형이다. 예를 들어 p=new Student().컴파일 시 유형은 Person이고 런타임 유형은 Student입니다.
프로그램은 실행 시 대상과 클래스의 진실한 정보를 발견해야 하는데 해결 방법은 두 가지가 있다.
① 컴파일할 때와 실행할 때의 유형 정보를 알고 있다고 가정하면 instanceof 연산자를 사용하여 판단한 다음에 강제 유형 변환을 이용하여 실행할 때의 유형 변수로 변환하면 된다.
② 컴파일할 때 해당 대상과 클래스가 어떤 클래스에 속할지 예측할 수 없으며, 프로그램은 실행할 때의 정보만으로 해당 대상과 클래스의 진실한 정보를 발견하려면 반사를 사용해야 한다.
2. Class 대상을 획득하는 세 가지 방법
① Class 클래스의 forName(String clazzName) 정적 방법을 사용합니다.이 방법은 문자열 파라미터를 입력해야 합니다. 이 문자열 파라미터의 값은 특정한 클래스의 한정된 클래스입니다. (전체 패키지 이름을 추가해야 합니다.)
② 클래스의 클래스 속성을 호출하여 해당 클래스에 해당하는 클래스 객체를 가져옵니다.예를 들어, Person.class는 Person 클래스에 해당하는 Class 객체를 반환합니다.
③ 객체에 대한 getClass() 메서드를 호출합니다.이 방법은java입니다.lang.object 클래스의 한 방법입니다. 따라서 모든 자바 대상은 이 방법을 호출할 수 있습니다. 이 방법은 대상이 속한 클래스에 대응하는Clas 대상을 되돌려줍니다.
3. Class에서 정보 얻기
package tju.chc.classtest;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

@Deprecated
@Annos(value = { @Anno,@Anno })
@Anno
public class ClassTest {
	@SuppressWarnings("unused")
	private ClassTest(){
		
	}
	public ClassTest(String[] args){
		
	}
	public void info(){
		System.out.println(" info ");
	}
	public void info(String str){
		System.out.println(" info " + ", str :" + str);
	}
	class Inner{
		
	}	
	public static void main(String[] args) throws NoSuchMethodException, SecurityException, ClassNotFoundException{
		Class<ClassTest> clazz = ClassTest.class;
		Constructor<?>[] ctors = clazz.getDeclaredConstructors();
		System.out.println(" ");
		for(Constructor<?> a:ctors){
			System.out.println(a);
		}
		System.out.println(" ");
		Constructor<?>[] publicCons = clazz.getConstructors();
		for(Constructor<?> p:publicCons){
			System.out.println(p);
		}
		System.out.println(" fangfa ");
		Method[] mds = clazz.getMethods();
		for(Method md:mds){
			System.out.println(md);
		}
		System.out.println(" String  info " + clazz.getMethod("info", String.class));
		
		Annotation[] anns = clazz.getAnnotations();
		System.out.println(" Annotations");
		for(Annotation an: anns){
			System.out.println(an);
		}
		System.out.println(" ");
		Class<?>[] inners = clazz.getDeclaredClasses();
		for(Class<?> in:inners){
			System.out.println(in);
		}
		Class<?> inner = Class.forName("tju.chc.classtest.ClassTest$Inner");
		System.out.println("neibuleidui :" + inner.getDeclaringClass());
		
		System.out.println("ClassTest :" + clazz.getPackage());
		System.out.println("Inner :" + inner.getPackage());
		System.out.println("ClassTest :" 
		+ clazz.getSuperclass()); 
	}
}
 
private tju.chc.classtest.ClassTest()
public tju.chc.classtest.ClassTest(java.lang.String[])
 
public tju.chc.classtest.ClassTest(java.lang.String[])
 fangfa 
public static void tju.chc.classtest.ClassTest.main(java.lang.String[]) throws java.lang.NoSuchMethodException,java.lang.SecurityException,java.lang.ClassNotFoundException
public void tju.chc.classtest.ClassTest.info(java.lang.String)
public void tju.chc.classtest.ClassTest.info()
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
 String  info public void tju.chc.classtest.ClassTest.info(java.lang.String)
 Annotations
@tju.chc.classtest.Annos(value=[@tju.chc.classtest.Anno(), @tju.chc.classtest.Anno()])
@java.lang.Deprecated()
 
class tju.chc.classtest.ClassTest$Inner
neibuleidui :class tju.chc.classtest.ClassTest
ClassTest :package tju.chc.classtest
Inner :package tju.chc.classtest
ClassTest :class java.lang.Object

좋은 웹페이지 즐겨찾기