자바 반사 총화 및 사용
11218 단어 자바-기초
공식 적 으로 소개 가 있어 요.
Reflection is commonly used by programs which require the ability to examine or modify the runtime behavior of applications running in the Java virtual machine.
자바 가상 컴퓨터 에서 실행 되 는 프로그램의 실행 행 위 를 검사 하거나 수정 할 수 있 는 프로그램 에 반사 된다 는 뜻 이다.
잘 모 르 겠 어 요.반사 가 뭘 할 수 있 는 지 말씀 드 리 겠 습 니 다.
4.567917.반 사 는 운행 할 때 특정한 유형의 인 스 턴 스 를 동적 으로 생 성 할 수 있다
4.567917.반 사 는 실행 할 때 특정한 변 수 를 가 져 오고 변수의 값 을 수정 할 수 있 습 니 다
4.567917.반 사 는 운행 할 때 특정한 방법 을 집행 할 수 있다
어떻게 반 사 를 사용 합 니까?
우 리 는 위의 상황 에 맞추어 어떻게 사용 하 는 지 일일이 말 했다.
우 리 는 먼저 com.reflect.demo.java 를 우리 의 후속 실험 에 사용 하도록 정의 합 니 다.
package com.reflect;
public class Demo {
public String pubStr = "public_string";
private String priStr = "private_string";
private String getPriStr(String testParam) {
pubStr = testParam;
return priStr;
}
private String getPriStr() {
return priStr;
}
public Demo() {
}
private Demo( String priStr ) {
this.priStr = priStr;
}
@Override
public String toString() {
return "Demo{" +
"pubStr='" + pubStr + '\'' +
", priStr='" + priStr + '\'' +
'}';
}
}
실행 할 때 어떤 종류의 인 스 턴 스 를 동적 으로 생 성 합 니 다.
// class , 3
Class demoClass = Class.forName("com.reflect.Demo");
// demoClass = Demo.class;
// demoClass = new Demo().getClass();
//
Constructor constructor = demoClass.getDeclaredConstructor();
//
constructor.setAccessible(true);
//
Object demo = constructor.newInstance();
//
Constructor constructor1 = demoClass.getDeclaredConstructor(String.class);
//
constructor1.setAccessible(true);
//
Object demo1 = constructor1.newInstance("I am String");
다음은 일반적인 인 스 턴 스 를 얻 는 방법 을 소개 한다.
/**
* ,
*
* @param className
* @return
*/
public static Object getObjectInstance(String className, Object... args) {
try {
Class[] classes = new Class[args.length];
for (int i = 0; i < args.length; i++) {
classes[i] = args[i].getClass();
}
Class objClass = Class.forName(className);
Constructor constructor = objClass.getDeclaredConstructor(classes);
constructor.setAccessible(true);
return constructor.newInstance(args);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return new Object();
}
실행 할 때 어떤 종류의 변 수 를 가 져 오고 변수의 값 을 수정 합 니 다.
다음 코드 는 Demo.java 의 실례 적 인 변수(priStr)를 가 져 와 값 을 부여 하 는 방법 을 알려 줍 니 다.
// new , priStr private_string
Demo demo = new Demo();
// demo class
Class demoClass = demo.getClass();
// priStr Field
Field priStrField = demoClass.getDeclaredField("priStr");
//
priStrField.setAccessible(true);
// priStr
// demo priStr , demo
Object priStrValue = priStrField.get(demo);
// priStr
// demo , demo
priStrField.set(demo,"I am Private String");
다음은 일반적인 속성 획득 방법 을 소개 한다.
/**
*
*
* @param obj
* @param fieldName
* @return
*/
public static Object getFieldValue(Object obj, String fieldName) {
try {
Field field = obj.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
return field.get(obj);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return new Object();
}
/**
*
*
* @param obj
* @param fieldName
* @param fieldValue
* @return
*/
public static boolean setFieldValue(Object obj, String fieldName, Object fieldValue) {
try {
Field field = obj.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
field.set(obj, fieldValue);
return true;
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return false;
}
실행 할 때 어떤 종류의 모든 방법 을 실행 합 니 다.
다음 코드 는 데모.자바 를 가 져 오 는 방법(getPriStr)을 알려 드 리 고 이 방법 을 호출 합 니 다.
// new , priStr private_string
Demo demo = new Demo();
// demo class
Class demoClass = demo.getClass();
// getPriStr Method
Method priStrMethod = demoClass.getDeclaredMethod("priStr");
//
priStrMethod.setAccessible(true);
//
Object priStr = priStrMethod.invoke(obj);
// getPriStr Method
Method priStrMethod1 = demoClass.getDeclaredMethod("priStr",String.class);
//
priStrMethod1.setAccessible(true);
//
Object priStr1 = priStrMethod1.invoke(obj,"I am testParam");
다음은 일반적인 호출 대상 방법 을 소개 한다.
/**
*
* @param obj
* @param methodName
* @param args
* @return
*/
public static Object invokMethod(Object obj, String methodName, Object... args) {
try {
Class[] classes = new Class[args.length];
for (int i = 0; i < args.length; i++) {
classes[i] = args[i].getClass();
}
Method method = obj.getClass().getDeclaredMethod(methodName, classes);
method.setAccessible(true);
method.invoke(obj,args);
return method.invoke(obj, args);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return new Object();
}
데모
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 부모 클래스 참조 지향 하위 클래스 대상글 목록 1.코드 예제 2.인터페이스 프로 그래 밍 을 위 한 사상 3.주의 코드 예제 을 이상 보 았 으 니 의문 이 있 을 수 있 습 니까?WTF???두 번 째 방법 은 많 지만 오히려 쓰 지 않 는 다??이것 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.