interface Animal{
public void eat();
public void bargin();
}
public class Dog implements Animal{
public void eat(){
System.out.println("原狗在吃香香");
}
public void bargin(){
System.out.println("原狗在叫");
}
public static void main(String[] args) {
//原类中狗的吃和叫方法
final Dog dog = new Dog(); //这里会被后面的动态代理的内部类调用,所以需要用final来修饰
dog.eat();
dog.bargin();
//继承类中狗的吃和叫方法
Dog dog2 = new NewDog();
dog2.eat();
dog2.bargin();
//装饰类中狗的吃和叫的方法
Dog dog3 = new Dog();
Animal ani = new 装饰狗(dog);
ani.eat();
ani.bargin();
//动态代理
Dog dog4 = new Dog();
Animal proxy = (Animal) Proxy.newProxyInstance(Dog.class.getClassLoader(),Dog.class.getInterfaces(),new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if("bargin".equals(method.getName())){
System.out.println("代理狗在叫");
return null;
}else{
return method.invoke(dog, args);
}
}
});
proxy.eat();
proxy.bargin();
}
}
//动态代理
//装饰
class 装饰狗 implements Animal{
private Animal ani = null;
public 装饰狗(Animal ani){
this.ani = ani;
}
public void bargin() {
System.out.println("装饰狗在叫");
}
public void eat() {
ani.eat();
}
}
//继承来重写方法
class NewDog extends Dog{
@Override
public void bargin() {
System.out.println("继承狗在叫");
}
}