本来想先写个讲义的自我总结,毕竟可变与强弱讲了不少相对具体的东西,比较好记
不过实验二为了测试类的private属性,要找合适的方法是真的麻烦,所以还是先把这个记下来吧
这个方法是用资源管理器的反射机制,需要import java.lang.reflect.*;
private属性:
class Edge {
private String source;//各private属性
private String target;
private int weight;
}
@Test
public void testSetSource() throws IllegalArgumentException, IllegalAccessException {
Graph<String> graph = emptyInstance();
Field [] fa = Edge.class.getDeclaredFields();//利用反射得到了所有变量的元数据组
for(Field f :fa){
if(f.getName().equals("source")){
f.setAccessible(true);//改变访问属性,绕过权限检测
Edge t = new Edge();
t.setSource("A");
String prs = (String) f.get(t);//从实例中提取field的内容
System.out.println(prs);
}
}
}
还有关于private方法的,虽然感觉用不到也没仔细看,但还是放着吧:
@Test
public void TestGetPM() throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{
Method [] ma = TestClass.class.getDeclaredMethods();
for(Method m :ma){
if(m.getName().equals("getName")){
m.setAccessible(true);
TestClass t = new TestClass();
Object [] prams ={"Lucas"};
String s =(String)m.invoke(t,prams);
System.out.println(s);
}
}
}
还有他用来举例的类:
public class TestClass {
public String pus = "This is a public String";
private String prs = "This is a private String";
public String getPublicString(){
return pus;
}
private String getPrivateString(){
return prs;
}
private String getName(String Name){
return "Your name is "+Name;
}
}
顺便再把第一次实验的抛出异常的检测也贴上来吧
这是@Test里的相关代码:
@Test
public void testAddVertex() {
FriendshipGraph graph=new FriendshipGraph();
Person a=new Person("A");
Person d=new Person("A");
graph.addVertex(a);
expectedEx.expect(RuntimeException.class);
expectedEx.expectMessage("The name 'A' has appeared.");
graph.addVertex(d);
}
嗯,还要配合这个操作一起食用:
@Rule
public ExpectedException expectedEx=ExpectedException.none();
原操作:
public void addVertex(Person n) {
for(Person v:vertex) {
if(n.name.equals(v.name)) {
throw new RuntimeException("The name '"+n.name+"' has appeared.");
}
}
vertex.add(n);
}
关于privat的属性和方法,来自博客:http://blog.sina.com.cn/s/blog_654c6ec70100qyek.html
异常的是百度来的,不记得具体是哪个博客了……或许不贴更合适点?