1.模拟对象与桩:空对象的逻辑变体是模拟对象和桩。桩对象是对系统中存在的一个依赖项的可控制的替代物,桩只是返回桩数据。模拟对象主要用来做交互性测试,模拟对象被创建出来是为了处理各种不同的测试情况。
2.接口与类型信息:interface关键字的一种重要目标就是允许程序员隔离构件,进而降低耦合性。
public static void main(String[] args) {
Person man = new Man();
man.sleep();
man.study();
if (man instanceof Man) {
Man man2 = (Man) man;
man2.say();
}
}
}
interface Person {
public void sleep();
public void study();
}
class Man implements Person {
public void say() {
}
@Override
public void sleep() {
}
@Override
public void study() {
}
}
我们需要的是用户使用接口,但是强制转型还是可以访问不存在于接口中的方法。解决方法1是直接声明,需要使用实际的类而不是接口,则需要自己对自己负责。解决方法2是包访问权限隐藏。
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
Class c = Class.forName("SixtyEight.Man");
Man man = (Man) c.newInstance();
Method[] methods = man.getClass().getDeclaredMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
Method m = c.newInstance().getClass().getDeclaredMethod("say");
m.setAccessible(true);
m.invoke(man);
}
}
interface Person {
public void sleep();
public void study();
}
class Man implements Person {
private void say() {
System.out.println("say()");
}
@Override
public void sleep() {
}
@Override
public void study() {
}
}
通过反射,可以通用所有方法,甚至是private方法。知道方法名就可以在Method对象上调用setAccessible(true)。

被折叠的 条评论
为什么被折叠?



