簡介
案例
public interface 動物 {
public void 睡覺();
public void 吃();
public void 叫();
}
public class 貓 implements 動物 {
@Override
public void 睡覺() {
System.out.println("呼呼呼地睡覺");
}
@Override
public void 吃() {
System.out.println("呵呵呵呵地吃");
}
@Override
public void 叫() {
System.out.println("喵喵喵地叫");
}
}
public class Main {
public static void main(String[] args) {
貓 cat = new 貓();
cat.叫();
cat.吃();
cat.睡覺();
}
}
運行結果:動物 a=(動物) Proxy.newProxyInstance(貓.class.getClassLoader(), 貓.class.getInterfaces(), new InvocationHandler());
可以看到newProxyInstance接受三個參數,第一個是被代理的類加載器,第二個是被代理的類所實現過的接口數組(因爲一個類可能實現了不止一個接口),第三個我們暫時不知道是什麼來的,我們先new它出來~~我們再說說newProxyInstance的返回值,這個返回值是一個Object,但是我們知道貓實現了動物接口,所以我們可以用動物來接受這個返回值,同時耶因爲返回值是一個object,所以在使用動物接收這個返回值的之前需要經過強轉。動物 a=(動物) Proxy.newProxyInstance(貓.class.getClassLoader(), 貓.class.getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
return null;
}
}
});
這裏唯一未實現的方法就是invoke了,需要說一下的是:現在a對象可以用來調用吃,睡,叫這三個方法啦。但是a調用這三個方法的時候最終底層還是會調用剛纔所實現的方法invoke~
public static void main(String[] args) {
貓 cat=new 貓();
動物 a=(動物) Proxy.newProxyInstance(貓.class.getClassLoader(), 貓.class.getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
if("叫".equals(arg1.getName())){
System.out.println("汪汪汪叫");
return null;
}else{
return arg1.invoke(cat, arg2);
}
}
});
a.叫();
}
在invoke方法裏面進行判斷,如果方法名等於“叫”的話,則進行我想要的操作:輸出”汪汪汪叫“。否則的話就調用貓原本的方法~
arg1.invoke(cat, arg2);
最後再說一下這個返回值,這個返回值是a調用實現接口的方法的返回值,如果沒有返回值則直接返回null。