前脚学习了下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 欢迎大家指点