JDK中的动态代理

//  Java中的动态代理: 1 被代理对象; 2 动态代理, 将被代理对象传入到动态代理类中, 生成动态代理对象
//  利用Proxy类中的newProxyInstance方法生成动态代理, 该方法有三个参数: a 被代理对象的类加载器;
//  b 被代理对象所有实现的接口; c InvocationHandler接口
//  该接口只有一个回调方法: invoke, 附带三个参数: a 被代理的对象(因为invoke为回调方法,所以无需用户关心); 
//  b 被代理对象的方法;  c 该方法需要传递的参数 ,  在invoke方法内部,可以实现需要的逻辑,返回利用反射生成的对象(method.invoke);
//  InvocationHandler接口可采用内部类实现,或将整个动态代理实现InvocationHandler接口,再传入this
//  这类似于Swing中的JFrame,实现监听器接口的操作。  3 利用动态代理生成被代理对象生成的动态代理对象, 然后直接调用欲调用的方法即可
import java.lang.reflect.*;
class DynamicProxy
{
private Object object;     //  被代理的对象
    public DynamicProxy(Object object){this.object = object;}  
    public Object getProxy()
    {
    Class objClass = object.getClass();
    return Proxy.newProxyInstance(objClass.getClassLoader(), objClass.getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
Object objAfterInvoked;
System.out.println("msg before dynamic proxy invoked");
objAfterInvoked = method.invoke(DynamicProxy.this.object, args);
System.out.println("msg after dynamic proxy invoked");
return objAfterInvoked;
}
});
    }
}
interface Subject     //  被代理对象的接口
{
    void fn1();
    void fn2();
}
class Subject1 implements Subject     //  具体的被代理对象
{
    public void fn1(){System.out.println("fn1");}
    public void fn2(){System.out.println("fn2");}
}
public class Main4
{
public static void main(String[] args)
{
// TODO Auto-generated method stub
        DynamicProxy proxy = new DynamicProxy(new Subject1());     //    将被代理的对象传递进去
        Subject sub = (Subject)proxy.getProxy();                   //    生成动态代理类
        sub.fn1();                                                 //    被代理包装后的方法,加了一些其他的业务逻辑
        sub.fn2();
}
}

你可能感兴趣的:(Java)