Java의 Private 메소드 및 필드에 액세스하는 방법
하지만 뭐 여러가지 조사해 보면 할 수 있어 메모해 둡니다.
원한다면 기름을 바르십시오.
사용 환경:
OS:Windows 10
자바 ver:8
IDE:eclipse 4.6 Neon
Jar 파일을 다운로드하자.
외부 사이트( htps : // 그럼. 오 sd. 네 t/p 로지ぇcts/sf )
에서 junit-addons Jar 파일을 가져옵니다.
매우 로컬 디렉토리에 저장하십시오.
Jar 파일을 추가하자.
eclipse를 시작하고 패키지 탐색기에서 마우스 오른쪽 버튼을 클릭하고 빌드 경로 → 빌드 경로 구성 → java 빌드 경로에서 외부 Jar를 추가합니다.
이것으로 준비 완료.
덧붙여서 API 사양은 어떤 느낌?
흠흠.
전혀 모르겠어.
말하자면 구루센세!
엉망진창 이동
테스트 프로그램을 준비합니다.
우선은 테스트 대상의 프로그램으로부터.
Sample.java
public class Sample {
// privateなフィールド変数
private int x = 10;
// privateでstaticなフィールド変数
private static int y = 20;
// privateなメソッド
private String testMethod(String x){
return x;
}
// privateでstaticなメソッド
private static String testStaticMethod(String y, String z){
return y + z;
}
}
그런 다음 JUnit 용 클래스 파일을 준비합니다.
SampleTest.java
import static org.junit.Assert.*;
import org.junit.Test;
import junitx.util.PrivateAccessor;
public class SampleTest {
@Test
/**
* privateのフィールド、メソッドにアクセスするテスト関数
*/
public void privateGetField() throws Throwable {
Sample sample = new Sample();
try {
// privateなフィールド変数にアクセスするためのメソッド。
// 第一引数:テスト対象クラスのインスタンス変数 第二引数:アクセスしたいフィールド変数名
int x = (int)PrivateAccessor.getField(sample, "x");
// アサーションにより実測値と期待値を比較
assertEquals(x,10);
// privateでstaticなフィールド変数も同様の手法でアクセスできる。説明省略
int y = (int)PrivateAccessor.getField(sample, "y");
assertEquals(y,20);
// privateな関数にアクセスするためのメソッド。
// 第一引数:テスト対象クラスのインスタンス変数 第二引数:アクセスしたいフィールド関数名
// 第三引数:引数の型の配列 第四引数:引数の値の配列
String method_x = (String)PrivateAccessor.invoke( sample,
"testMethod",
new Class[]{String.class},
new Object[]{"private_x"});
assertEquals(method_x,"private_x");
// privateでstaticな関数も同様の手法でアクセスできる。引数の型の数に応じて第三、第四引数を工夫すること
String method_y = (String)PrivateAccessor.invoke( sample,
"testStaticMethod",
new Class[]{String.class,String.class},
new Object[]{"private_","static_y"});
assertEquals(method_y,"private_static_y");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}finally{
}
}
}
실행
도야!
할 수 있었다!
덤
private인 필드 변수에 값을 세트할 수도 버리거나.
SampleTest.java
//途中省略
@Test
/**
* privateなフィールド変数に値をセットする関数
*/
public void privateSetField(){
Sample sample = new Sample();
try {
// 第一引数:テスト対象クラスのインスタンス変数 第二引数:変数の名前
// 第三引数: セットしたい値
PrivateAccessor.setField(sample, "x", 100);
// セットできたか確認!
int get_x = (int)PrivateAccessor.getField(sample, "x");
assertEquals(get_x,100);
} catch (NoSuchFieldException e) {
e.printStackTrace();
}finally{
}
}
끝
Reference
이 문제에 관하여(Java의 Private 메소드 및 필드에 액세스하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/taro_9674/items/f10faa09042650ea14fa텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)