자바 중 반사 상해
자바 반 사 는 실행 상태 에서 클래스 의 속성 과 방법 을 얻 거나 클래스 가 실 행 될 때의 행 위 를 수정 할 수 있 는 과정 을 말한다.
java.lang.class 클래스 는 메타 데 이 터 를 가 져 오고 검사 하 며 클래스 가 실 행 될 때의 행동 을 바 꾸 는 데 많은 방법 을 제공 합 니 다.
자바 의 반 사 는 주로 자바.lang 과 자바.lang.reflect 패키지 의 클래스 와 관련된다.
반사 응용 장면 예
java.lang.Class 는 주로 다음 과 같은 두 가지 기능 을 제공 합 니 다.
Method
Description
1) public String getName()
클래스 이름 되 돌리 기
2) public static Class forName(String className)throws ClassNotFoundException
클래스 를 불 러 오고 Class 대상 을 되 돌려 줍 니 다.
3) public Object newInstance()throws InstantiationException,IllegalAccessException
인 스 턴 스 대상 만 들 기
4) public boolean isInterface()
인터페이스 여 부 를 판단 하 다.
5) public boolean isArray()
배열 여 부 를 판단 하 다.
6) public boolean isPrimitive()
원본 데이터 형식 인지 판단 하기
7) public Class getSuperclass()
부모 클래스 참조 되 돌리 기
8) public Field[] getDeclaredFields()throws SecurityException
클래스 의 구성원 속성 필드 배열 을 되 돌려 줍 니 다.
9) public Method[] getDeclaredMethods()throws SecurityException
클래스 를 되 돌려 주 는 방법 배열
10) public Constructor[] getDeclaredConstructors()throws SecurityException
클래스 의 구조 방법 배열 을 되 돌려 줍 니 다.
11) public Method getDeclaredMethod(String name,Class[] parameterTypes)throws NoSuchMethodException,SecurityException
클래스 에서 지정 한 매개 변수 형식 을 되 돌려 주 는 방법
어떻게 Class 대상 을 가 져 옵 니까?
세 가지 방법 이 있 는데 다음 과 같다.
동적 로 딩 에 사용 할 수 있 습 니 다.클래스 의 전체 제한 이름 을 알 고 있 을 때 이 방식 을 사용 할 수 있 습 니 다.원본 데이터 형식 이 이 방법 에 적용 되 지 않도록 주의 하 십시오.
package tmp;
class Simple
{
}
public class Test
{
public static void main(String args[]) throws ClassNotFoundException
{
Class<?> c = Class.forName("tmp.Simple");
System.out.println(c.getName());
System.out.println(c.getSimpleName());
}
}
tmp.Simple
Simple
getClass()방법 예시:인 스 턴 스 대상 에서 Class 대상 가 져 오기
package tmp;
class Simple
{
}
public class Test
{
void printName(Object obj)
{
}
public static void main(String args[])
{
Simple s = new Simple();
Class<? extends Object> c = s.getClass();
System.out.println(c.getName());
System.out.println(c.getSimpleName());
}
}
tmp.Simple
Simple
.class 문법 예시클래스 이름 에 도 사용 할 수 있 고 원시 데이터 형식 에 도 사용 할 수 있 습 니 다.다음 과 같 습 니 다.
package tmp;
public class Test
{
public static void main(String args[])
{
Class<Boolean> c = boolean.class;
System.out.println(c.getName());
Class<Test> c2 = Test.class;
System.out.println(c2.getName());
}
}
boolean
tmp.Test
Class 대상 에 대응 하 는 유형 판단다음 방법 은 Class 대상 이 대응 하 는 유형 을 판단 하 는 데 사용 할 수 있 습 니 다.
1) public boolean isInterface(): 인터페이스 대응 여부
2) public boolean isArray(): 대응 하 는 배열 여부
3) public boolean isPrimitive(): 원본 데이터 형식 에 대응 할 지 여부
코드 예제:
package tmp;
class Simple
{
}
interface My
{
}
public class Test
{
public static void main(String args[])
{
try
{
Class<?> c = Class.forName("tmp.Simple");
System.out.println(c.isInterface());
Class<?> c2 = Class.forName("tmp.My");
System.out.println(c2.isInterface());
}
catch (Exception e)
{
System.out.println(e);
}
}
}
false
true
반사 로 인 스 턴 스 대상 만 들 기두 가지 방법 이 있 는데 다음 과 같다.
Class 대상 호출 newInstance()방법 예시
package tmp;
class Simple
{
void message()
{
System.out.println("Hello Java");
}
}
public class Test
{
public static void main(String args[])
{
try
{
Class<?> c = Class.forName("tmp.Simple");
Simple s = (Simple) c.newInstance();
s.message();
}
catch (Exception e)
{
System.out.println(e);
}
}
}
Hello Java
Constructor 대상 호출 newInstance()방법 예시이 곳 은 전 송 된 매개 변수의 유형 에 따라 지 정 된 구조 방법 을 얻 을 수 있 고 구조 방법의 접근 권한 제한 도 바 꿀 수 있 음 을 주의 하 십시오.
package tmp;
import java.lang.reflect.Constructor;
class Simple
{
private String msg;
void message()
{
System.out.println("Hello Java," + msg);
}
private Simple(String s){
this.msg = s;
}
}
public class Test
{
public static void main(String args[])
{
try
{
Class<?> c = Class.forName("tmp.Simple");
Constructor<?> con = c.getDeclaredConstructor(String.class);
con.setAccessible(true);
Simple s = (Simple) con.newInstance("...");
s.message();
}
catch (Exception e)
{
System.out.println(e);
}
}
}
Hello Java,...
반사 를 통 해 사유 방법 을 호출 하 다반 사 를 통 해 우 리 는 다른 종류의 개인 적 인 방법 을 호출 할 수 있 습 니 다.주로 자바.lang.class 와 자바.lang.reflect.Method 류 와 관련 됩 니 다.
그 중에서 주로 Method 류 의 setAccessible 방법 과 invoke 방법 을 사 용 했 고 전 자 는 방문 권한 을 수정 하고 후 자 는 호출 방법 을 사용 했다.
참조 사유 방법 예제 호출:
package tmp;
import java.lang.reflect.Method;
class A
{
private void cube(int n)
{
System.out.println(n * n * n);
}
}
class Test
{
public static void main(String args[]) throws Exception
{
Class<A> c = A.class;
Object obj = c.newInstance();
Method m = c.getDeclaredMethod("cube", new Class[]{ int.class });
m.setAccessible(true);
m.invoke(obj, 4);
}
}
javap 도구 에 대하 여자바 p 명령 을 사용 하면 자바 의 바이트 코드 파일 을 역 어 셈 블 리 하여 class 파일 의 필드 속성,구조 방법,일반 방법 정 보 를 보 여 줍 니 다.
사용 설명:
javap java.lang.Object 예제
javap-c 테스트 예제:
간단 한 Test 클래스 를 쓰 십시오.다음 과 같 습 니 다.
package tmp;
class Simple
{
}
public class Test
{
public static void main(String args[])
{
System.out.println("Hello");
}
}
javap-c Test 입력:참고 자료
기본적으로 번역 에 속 하여 작은 부분 을 수정 하 였 다.
http://www.javatpoint.com/java-reflection
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.