您的位置:首页 > 编程语言 > Java开发

简述Java动态代理

2016-07-24 22:26 218 查看
引入引用变量的概念

栈内存负责存储对象名称和局部变量的值,而堆内存存储对象值

每一个对象,在声明对象的时候,会在栈对象中分配内存,例如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 =
4000
new Superman();

        Proxy p = new Proxy(s);

        Subject s2 = (Subject) java.lang.reflect.Proxy.newProxyInstance(s.getClass().getClassLoader(), s.getClass().getInterfaces(), p);

        s2.shopping();

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态代理 java