java动态代理和Proxy运用

接口
package com.test.proxy;

public interface IHello {
public void sayHello();
}

具体实现类

package com.test.proxy;

public class Hello implements IHello {

	@Override
	public void sayHello() {
		// TODO Auto-generated method stub
		System.out.println("hello world vinthy");
	}


}

动态代理类及测试
package com.test.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyHello implements InvocationHandler {
	private Object obj;
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object returnObject = null;
		System.out.println("before..");
		returnObject = method.invoke(obj, args);
		System.out.println("after..");
		return returnObject;
	}
	public void bind(Object obj) {
		 this.obj = obj;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		  ProxyHello proxy = new ProxyHello();
		  //由Proxy生成代理对象在调用方法是会调用InvactionHander里面Invoke方法
	IHello	hello =(IHello) Proxy.newProxyInstance(Hello.class.getClassLoader(), Hello.class.getInterfaces(), proxy);
	proxy.bind(new Hello()); 
	hello.sayHello();
	}
	
}


//由Proxy生成代理对象在调用方法是会调用InvactionHander里面Invoke方法

这句注释是重点,测试得出结论就是用Proxy生成的代码无论是什么方法都会调用InvactionHander实现的Invoke方法,因此在调用如方法sayHello时,其实是调用InvactionHander实现Invoke的方法,并不会调用本身sayHello方法,要是我们在Invoke方法中不写对真正原方法的调用,就相当于对类的方法进行了重写,明明看到调用sayHello方法了,此时就会发现sayHello不会起作用了。因此,要实现动态代理必须要在Invoke方法中调用代理对象的真正方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值