码迷,mamicode.com
首页 > 其他好文 > 详细

JDK动态代理实现

时间:2018-03-28 23:57:27      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:override   就是   oid   目标   定义   返回结果   log   回调   动态代理   

创建一个实现类的接口,因为动态代理的本质其实就是代理接口

package com.xiawei.reflect.jdkproxy;

public interface JavaClassDao {

public void say();
}

===========================================

实现上面的借口

package com.xiawei.reflect.jdkproxy;

public class JavaClassDaoImpl implements JavaClassDao{

@Override
public void say() {
System.out.println("这是真实对象的方法!");
}

}

===========================================

创建动态代理类,并让其实现 java.lang.reflect.InvocationHandler接口

package com.xiawei.reflect.jdkproxy;

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

public class JdkProxyClass implements InvocationHandler {
//定义一个真实对
private Object target;
//创建真实对象与代理对象的代理关系,并返回代理对象
public Object bind(Object target){
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}

//代理方法逻辑
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//在代理方法逻辑中,可以在调用真实对象的方法前执行需要的方法逻辑
System.out.println("在调用真实对象的方法前,执行的方法逻辑!");
//调用真实对象的方法
Object object = method.invoke(target, args);//通过反射执行目标对象的方法[这里相当于target.]
//在代理方法逻辑中,可以在调用真实对象的方法后执行需要的方法逻辑
System.out.println("在调用真实对象的方法后,执行的方法逻辑。");
//在这里,如果调用的真实对象没有返回值,则object为null,否则返回调用对象方法的返回结果
return object;
}

}

===========================================

package com.xiawei.reflect.jdkproxy;

public class Test {

public static void main(String[] args) {
//要调用真实类的方法,就要先创建 代理类对象
JdkProxyClass jpc = new JdkProxyClass();
//然后通过代理类对象的bind()方法获得代理对象(即:绑定关系,因为挂在接口JavaClassDao下面)
//所以申明代理对象JavaClassDao proxy
JavaClassDao proxy = (JavaClassDao) jpc.bind(new JavaClassDaoImpl());
//通过代理对象调用真实类的方法
proxy.say();

}

}

//测试结果:

  在调用真实对象的方法前,执行的方法逻辑!
  这是真实对象的方法!
  在调用真实对象的方法后,执行的方法逻辑。

JDK动态代理实现

标签:override   就是   oid   目标   定义   返回结果   log   回调   动态代理   

原文地址:https://www.cnblogs.com/xiaweicn/p/8666625.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!