标签:调用 throwable handler obj 类加载 如何 方法调用 load object
(动态代理:JDK动态代理,GGLIB动态代理)
JDK动态代理
例如饭店是一个接口,中餐店、西餐店、自助餐馆都属于饭店。不管哪种饭店,都会提供饭菜,所以都有提供饭菜的方法,只是提供的饭菜不同。在饭店提供饭菜之前,都需要点餐,在提供饭菜之后,都需要付款。那如何实现,在各种餐厅执行提供饭菜方法的前后执行点餐和付款代码呢?如果后期新增了快餐店,如何自动执行点餐和付款呢?
创建饭店接口类
public interface Restaurant {
void show();
}
创建中餐点,西餐店,自助餐类实现饭店类并重写方法
public class ChineseFood implements Restaurant{
@Override
public void show() {
System.out.println("提供中餐。。。");
}
}
public class WesternFood implements Restaurant{
@Override
public void show() {
System.out.println("提供西餐。。。");
}
}
public class Buffet implements Restaurant{
@Override
public void show() {
System.out.println("提供自助餐。。。");
}
}
创建完成之后,写一个动态助理类实现中转,强化功能
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicAgent implements InvocationHandler{
private Object object;//动态代理,创建一个你需要代理的对象 ChineseFood
public Object bind(Object object){//object ChineseFood
this.object=object;//this关键字指向本类中的object为传进来的object
return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),this);
//object.getClass().getClassLoader()类加载器,object.getClass().getInterfaces()类接口,this(自己理解(实现类))
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//重写invoke方法
//proxy是对象,对象为类中的属性 method为类中的方法 args为方法中的形参,因为形参可能不止一个,所以用数组
System.out.println("点菜。。。");
Object result = method.invoke(object, args);//method(方法).invoke(引进)
System.out.println("付款。。。");
return result;
}
}
书写完成之后,写出测试类进行确认
public class Test {
public static void main(String[] args) {
Restaurant r=new ChineseFood();//main方法调用的时候,要使用多态的方法
Restaurant r2 = (Restaurant) new DynamicAgent().bind(r);
r2.show();
}
}
标签:调用 throwable handler obj 类加载 如何 方法调用 load object
原文地址:https://www.cnblogs.com/LKJfool/p/14782733.html