简述Java动态代理

来源:互联网 发布:阿里云 服务器 使用 编辑:程序博客网 时间:2024/05/22 07:44
引入引用变量的概念
栈内存负责存储对象名称和局部变量的值,而堆内存存储对象值
每一个对象,在声明对象的时候,会在栈对象中分配内存,例如Duck d,那么栈内存则会分配位置给D
,而d里面的参数和值,都是没有的,为啥,因为没有给d分配内存,只是声明了一个对象而已。而new关键字
就是为对象申请了内存,而该对象内存则存储在系统堆内存里面。。。这也是引用变量!
而比较特殊的是基本数据类型,他们的内存都是存储在栈内存里面:举例:说如果对象在栈内存里的存储方式为Duck d,那么局部变量的存储就是Duck d = new Duck();
2.值传递和引用传递
通过判断对象的内存来判断是值传递还是引用传递,从而达到修改数值的目的!
String不是基本数据类型String str = “String”;其实是已经实例化了对象
从上部分可以明白,如果数据是存储在栈内存,则为值传递,如果是堆内存,则为引用传递
3.动态对象代理
还是比较有用的,例如需要处理一件事物的时候,又要插入做其他事情。。。
正如如果需要处理很多事情,通过reflect.Proxy的代理去处理,对数据资源进行统一的处理!
需要调用Reflect的两个接口,一个是:InvocationHandler,另一个是newProxyInstance()
实现客户对数据的动态代理。。。我也不知道是毛东西,连反射都不知道是啥,说个JB,看代码吧。。
public class Proxy implements InvocationHandler {
    private Superman target;
    public Proxy(Superman target) {
        this.target = target;
    }
    @Override
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
        System.out.println(“大量的评估工作”);
        target.setMoney(5);
        method.invoke(target, objects);
        System.out.println(target.getMoney()>10?”吃屎去吧”:”代购去吧”);
        return null;
    }
}
    public static void main(String[] args) {
        //动态代理
        Superman s = new Superman();
        Proxy p = new Proxy(s);
        Subject s2 = (Subject) java.lang.reflect.Proxy.newProxyInstance(s.getClass().getClassLoader(), s.getClass().getInterfaces(), p);
        s2.shopping();
}}
      Superman s = new Superman();
        Proxy p = new Proxy(s);
        Subject s2 = (Subject) java.lang.reflect.Proxy.newProxyInstance(s.getClass().getClassLoader(), s.getClass().getInterfaces(), p);
        s2.shopping();

 

0 0
原创粉丝点击