java的动态代理,jdk动态代理,一个Sping AOP的简单实现

在静态代理中,必须有已知的代理类,并且每一个类若是想要一个代理类的话都得从新写,这样的代码量以及后期的维护量都太大了,为了解决这个麻烦,咱们使用动态代理java

既然动态代理解决了静态代理的麻烦,那么必然的,咱们不须要为每个类都写一个代理类了,由于代理类是自动生成的。jdk的动态代理是基于接口的,因此,首先咱们仍是须要一个接口数组

/**
 * Created by lidongyang on 2017/8/22 0022.
 */
public interface Person {
    void getMsg(String name);
}

接着,目标类是必须的了。目标类要实现上述接口的ide

/**
 * Created by lidongyang on 2017/8/22 0022.
 */
public class SuperStar implements Person{
    //目标方法
    public void getMsg(String name){
        System.out.println("我叫"+ name +",我是个明星");
    }

}

接下来,咱们不须要本身再写代理类了,可是咱们须要写一个中介类(目标类与代理类之间的中介类),不过不要担忧,这个类咱们只要写一次就够了。测试

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

/**
 * Created by lidongyang on 2017/8/22 0022.
 */
public class Hanlder<T> implements InvocationHandler {
    //目标类
    private T t;

    public Hanlder(T t){
        this.t = t;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //目标方法执行前的一些代码
        System.out.println("-------------before------------");
        System.out.println("方法名:" + method.getName());
        System.out.print("参数:");
        for (int i =0;i<args.length;i++){
            System.out.print(args[i]);
        }
        System.out.println();
        //执行目标方法
        Object result = method.invoke(t,args);
        //目标方法执行后的一些代码
        System.out.println("返回值:" + result);
        System.out.println("-------------after------------");
        return result;
    }
}

接着,咱们来测试一下this

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

/**
 * Created by lidongyang on 2017/8/21 0021.
 */
public class LockTest{

    public static void main(String[] args) {
        InvocationHandler handler = new Hanlder(new SuperStar());
        //生成代理类
        //第一个参数:代理类的类加载器
        //第二个参数:目标类实现的接口类数组
        //第三个参数:就是上面的hanlder
        Person person = (Person)Proxy.newProxyInstance(handler.getClass().getClassLoader(), 
                        new Class[]{Person.class}, handler);
        //经过代理类执行目标方法
        person.getMsg("林志玲");
    }
}

输出为.net

 

看到这里,有没有发现,这其实就是个Spring AOP的简单实现代理

cglib动态代理地址:https://my.oschina.net/u/3410701/blog/edit/1518888blog

相关文章
相关标签/搜索