1.【每日分享】动态代理实现一JDK原生动态代理

Java动态代理对象,今天和大家分享一下动态代理的一种实现方案,使用JDK原生方案。

什么是动态代理

我们比较熟悉数据库连接池,在对数据库进行操作是,我们首先获取数据库对象,我们获取的其实不是真正的对象,而是它的代理对象。

举个栗子,在使用一个jar的时候,我想重写jar包的部分方法,其他的还是按照它原来的逻辑处理,我们有没有它的源码,怎么办呢,这个时候就可以使用动态代理来实现。

怎么实现动态代理

1.需要跟真是对象实现相同的接口
2.对于需要重写的方法重写
3.对于不需要重写的直接调用真正的对象完成

java动态代理对象

动态代理.png

代码实现

接口类

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实现动态代理

你可能感兴趣的:(1.【每日分享】动态代理实现一JDK原生动态代理)