Java反射机制访问私有变量,私有方法,在Junit测试中很好用。
反射细节方面可参考:http://www.cnblogs.com/crazypebble/archive/2011/04/13/2014582.html
以下代码作为参考:
package com.refl.test;
public class ReflectTest {
/**
* @param argss
*/
public static void main(String []argss)
{
try{
//访问单个私有变量
// Class cls = Class.forName("com.refl.person.Person");
// Field fld = cls.getDeclaredField("studentCount");
// fld.setAccessible(true);
// Object obj = cls.newInstance();
// fld.set(obj, "测试"); //改变该私有变量的值
// System.out.println(fld.get(obj));
//访问单个私有变量
// Person person = new Person();
// Class cls = person.getClass();
// Object obj = cls.newInstance();
// Field fld = cls.getDeclaredField("studentCount");
// fld.setAccessible(true);
// fld.set(obj, "测试"); //改变该私有变量的值
// System.out.println(fld.get(obj));
//访问所有变量,当然也包括私有的
// Class cls = Class.forName("com.refl.person.Person");
// Field []field = cls.getDeclaredFields();
// for(Field fld : field)
// {
// fld.setAccessible(true);
// System.out.println(fld.get(cls.newInstance()));
// }
}catch(Throwable e)
{
e.printStackTrace();
}
}
}
package com.refl.person;
public class Person {
private String studentCount = "4";
public int age = 23;
private String getName(String N1, String N2)
{
System.out.println("studentCount = " + studentCount);
return "Jack";
}
public String getGender(String N1, String N2)
{
return "male";
}
}
//访问私有方法
Class[] classArray = {Scenario.class, Alarm.class};
Method method = c.getDeclaredMethod("endScenarioStep", classArray);
method.setAccessible(true);
Object[] args = {getScenario(), alarm};
method.invoke(logic, args);
//Junit测试代码
public void testProblemManageProcess021() {
try {
Alarm alarm = getAlarm("Alarms_0080001" , 2);
S2NMAL0080001Blogic logic = new S2NMAL0080001Blogic();
Map<String, String> workflow = new HashMap<String, String>();
workflow.put(logic.STEP_AFT, "step1001");
Class c = logic.getClass();
Field fld = c.getSuperclass().getDeclaredField("workflow");
fld.setAccessible(true);
fld.set(logic, workflow);
Class[] classArray = {Scenario.class, Alarm.class};
Method method = c.getDeclaredMethod("endScenarioStep", classArray);
method.setAccessible(true);
Object[] args = {getScenario(), alarm};
method.invoke(logic, args);
} catch (Throwable t) {
t.printStackTrace();
fail(t.getMessage());
}
}