JAVA代理模式 - 动态代理(三)

核心思想

JAVA代理模式(一)
JAVA代理模式 - 静态代理(二)

A. 用于增强一些方法,在方法执行前后做任何你想做的事情,实现无侵入式的代码扩展;
B. 可以用作远程调用这样的场景;
C. 每一个动态代理类都必须要实现InvocationHandler这个接口,实现invoke方法,动态代理类只能代理接口(不支持抽象类);
D. 一定会用到的类或者接口是:InvocationHandler(Interface)、Proxy(Class);
E. 代理类与普通类的唯一区别就是,其字节码是由 JVM 在运行时动态生成的而非预存在于任何一个 .class 文件中;
F. 每次生成动态代理类对象时都需要指定一个类装载器对象,指定为和目标对象同一个类加载器;
G. 生成的代理类为public final,不能被继承,类名:格式是“$ProxyN”,N是逐一递增的数字。

实现步骤

1.定义一个接口;
2.定义一个该接口的真实实现类;
3.定义一个Handler类,该类实现InvocationHandler接口,并实现invoke方法,在该类中可以定义获取代理对象的方法,还可以把该方法在客户端类中进行定义。

示例代码

1.定义一个接口TheUser.java
    package com.rocky.learn.l003.t3;
    public interface TheUser {
		public abstract String say();
    }

2.定义一个该接口的真实实现类 TheUserImpl.java
	package com.rocky.learn.l003.t3;
    public class TheUserImpl implements TheUser {
	    @Override
	    public String say() {
		    return "Hello world, And I'm testing the DYNAMIC-PROXY.";
	    }
    }


3.定义一个Handler类,该类实现InvocationHandler接口,并实现invoke方法,在该类中可以定义获取代理对象的方法,还可以把该方法在客户端类中进行定义MyInvocationHandler.java
    package com.rocky.learn.l003.t3;
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    public class MyInvocationHandler implements InvocationHandler {
        private Object target; //The real object
        public MyInvocationHandler(Object target) {  
            super();  
            this.target = target;  
        }
	    @Override
	    public Object invoke(Object object, Method method, Object[] args)
			throws Throwable {
            System.out.println(">BEFORE");  
            Object result = method.invoke(target, args);
            System.out.println(result);
            System.out.println(">END.");  
            return result;
	    }
	    public Object getProxy() {  
            return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);  
        } 
    }

如何调用

package com.rocky.learn.l003.t3;
public class Test {
 public static void main(String[] args) {
  MyInvocationHandler handler = new MyInvocationHandler(new TheUserImpl());
  TheUser proxy = (TheUser) handler.getProxy();
  proxy.say();
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cloneme01

谢谢您的支持与鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值