首页 > 代码库 > 动态代理1

动态代理1

动态代理的功能:

1:增强一个类的方法。

2:在不修改源类的情况下,修改类的行为或是方法。

在Java中有一个类

Proxy

动态代理在运行时,会创建被代理类的接口号的子类.

 

1:只这么一个要求:

所有被代理的类,必须要拥有一个接口。

2:动态代理有两个核心类

1:Proxy具体类,它的静态方法newProxyInstance用于动态的创建一些接口的子类.

2:InvocationHandler – 执行的句柄 (即在执行时可以拦到代理人的所有方法)

有一个方法

Invoke(Object proxy,Method mehod,Object[] args)

Prxoy:代理人.

Method:被执行的代理人的方法的反射对象。

此method与tom有相同的功能。来自于同一个接口。

Args:方法上的参数

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyDemo {
    public static void main(String[] args) {
        //1:声明Tom实例,被代理对象
        final Tom tom = new Tom();
        //2:声明tom的代理对象
        Object obj =
                Proxy.newProxyInstance(
                        ProxyDemo.class.getClassLoader(),//用哪一个类加载器在内存中创建IPerson的子类
                        new Class[]{IPerson.class},//指定创建哪一些接口的子类
                        new InvocationHandler() {
                            public Object invoke(Object proxy, Method method, Object[] args)
                                    throws Throwable {
                                System.err.println("准备好");
                                //动态的执行tom这个类的run方法
                                method.invoke(tom,args);
                                System.err.println("第一名");
                                return null;
                            }
                        });
        //3:目前obj就是IPerson的子类
        System.err.println(obj.getClass());
        IPerson tomProxy = (IPerson) obj;
        tomProxy.run();
    }
}


//开发一个接口
interface IPerson{
    public void run();
    public void say();
}
//开发一个具体类
class Tom implements IPerson{
    public void run() {
        System.err.println("正在跑步...ing....");
    }
    public void say() {
        System.err.println("你好我们是朋友");
    }
}

class com.sun.proxy.$Proxy0
准备好
跑步中
第一名