Java动态代理对象,今天和大家分享一下动态代理的一种实现方案,使用JDK原生方案。
什么是动态代理
我们比较熟悉数据库连接池,在对数据库进行操作是,我们首先获取数据库对象,我们获取的其实不是真正的对象,而是它的代理对象。
举个栗子,在使用一个jar的时候,我想重写jar包的部分方法,其他的还是按照它原来的逻辑处理,我们有没有它的源码,怎么办呢,这个时候就可以使用动态代理来实现。
怎么实现动态代理
1.需要跟真是对象实现相同的接口
2.对于需要重写的方法重写
3.对于不需要重写的直接调用真正的对象完成
java动态代理对象
代码实现
接口类
package proxy;
public interface MyBusiness {
public void method1();
public void method2();
}
真正对象
package proxy;
public class MyBusinessImpl implements MyBusiness {
@Override
public void method1() {
System.out.println("#########method1##########");
}
@Override
public void method2() {
System.out.println("#########method2##########");
}
}
代理对象
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyMain {
public static void main(String[] args) throws Exception{
final MyBusiness obj = new MyBusinessImpl();
// obj.method1();
// obj.method2();
MyBusiness pro = (MyBusiness)Proxy.newProxyInstance(ProxyMain.class.getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TOD Auto-generated method stub
if("method1".equals(method.getName())){
System.out.println("proxy successed");
return null;
}else{
return method.invoke(obj, args);
}
}
});
pro.method1();
}
}
这是使用jdk的简单实现,下篇给大家分享cglib实现动态代理