jdk动态代理

前脚学习了下java反射,后脚学习jdk动态代理。这是。。。。

不说废话,jdk动态代理就是写各类实现InvocationHandler接口,重写invoke方法。具体实现如下:

//导包的时候记得要导java.lang.reflect包下的类哦
//如果你想测试,千万别把下面的代码写在一个Java文件中
//接口代码
public interface Programming {
	void writingCode();
}

//实现Programming类1
public class ProgrammingJavaImpl implements Programming {
	@Override
	public void writingCode() {
		System.out.println("user java writing code");
	}
}

//实现Programming类2
public class ProgrammingPythonImpl implements Programming {
	@Override
	public void writingCode() {
		System.out.println("user Python writing code");
	}
}

//代理类
public class ProgrammingProxy implements InvocationHandler {
	private Object target;
	public Object bindInterface(Object target) {
		this.target = target;
		//这里就用到了Java反射了,通过getClass获取驱动和接口方法,返回继承的接口的子类的实例对象
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
	}
	/*
	此方法中Method类调用invoke方法前后可以添加要做的事
	也就是说上面的bindInterface方法可以不要,直接写构造方法如
	public ProgrammingProxy(Object obj) {
		this.target = obj
	}
	效果是一样的。bindInterface方法是为了返回一个被代理接口对象类型的实例,让接口句柄直接指向这个实例,就不需要再用反射来获取接口的实例了
	*/
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Object result = null;
		//代理类执行前(这里可以添加日志啊,事务啊什么的。。。)
		System.out.println("学习编程语言");
		result = method.invoke(target, args);
		//代理类执行后(这里可以添加日志啊,事务啊什么的。。。)
		System.out.println("收获的时候到了:年薪30w");
		return result;
	}
}


测试代码

	public static void main(String[] args) {
		ProgrammingProxy p = new ProgrammingProxy();
		Programming pp = (Programming) p.bindInterface(new ProgrammingJavaImpl());
		pp.writingCode();
	}


我的jdk动态代理: http://blog.youkuaiyun.com/a695422768/article/details/73330951 欢迎大家指点



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值