JDK Proxy实现接口代理
2014-04-27 00:14
555 查看
JDK提供的java.reflect.Proxy代理类提供基于接口代理功能,由Proxy.newProxyInstance(ClassLoader interfaceClassLoader,Class<?>[] interfaces, InvocationHandler handler)创建的对象属于java.reflect.Proxy实例,由于Java中只能实现单继承,所以无法对类进行代理。生成的类默认重载了java.lang.Object的hashCode、toString、equals方法,所以调用proxy.hashCode也会间接的调用Proxy的InvoctionHandler的实现。
若要对类进行代理,可以考虑采用CGLIB为类生成动态功能。
以下是JDK Proxy实现接口代理的功能代码:
1、被代理接口定义
2、执行处理器
若要对类进行代理,可以考虑采用CGLIB为类生成动态功能。
以下是JDK Proxy实现接口代理的功能代码:
1、被代理接口定义
package zd.proxy; /** * 用户操作Bean。 * @author jim * */ public interface UserDao { /*** * 插入用户。 * @param user User */ void insert(String user); }
package zd.proxy; public interface PersonDao { void call(); }
2、执行处理器
package zd.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import static java.lang.System.out; /** * Proxy执行处理器,此类无状态,单例。 * @author jim * */ public class JdkProxyInvocationHandler implements InvocationHandler { private static JdkProxyInvocationHandler instance= null; /** 私有构造器 */ private JdkProxyInvocationHandler() { } @Override public Object invoke(Object target, Method targetMethod, Object[] params) throws Throwable { // Proxy示例实现了提供的所有接口,并继承自Proxy out.println(target instanceof UserDao); // true out.println(target instanceof Proxy); // true out.println(target instanceof PersonDao); // true out.println(params[0]); // sss return null; } /** * 获取该类实例 * @return */ public static JdkProxyInvocationHandler getInstance(){ if (instance == null){ initInstance(); } return instance; } /** * 初始化示例。 */ private static synchronized void initInstance(){ if (instance == null){ instance = new JdkProxyInvocationHandler(); } } }3、代理创建与接口调用测试。
package zd.proxy; import java.lang.reflect.Proxy; import org.junit.Test; /** * JDK Proxy测试,采用JUnit。 * @author jim * */ public class JdkProxy { /** * 测试接口代理。 */ @Test public void testInterface(){ UserDao proxy = (UserDao)Proxy.newProxyInstance(UserDao.class.getClassLoader(), new Class[]{UserDao.class,PersonDao.class}, JdkProxyInvocationHandler.getInstance()); proxy.insert("ssss"); } }
相关文章推荐
- Spring2.5学习4.2_Proxy实现动态代理(目标类实现随意接口)
- 有接口的CGLIB动态代理实现
- java代理 InvocationHandler接口实现
- Spring的AOP实现使用的JDK的动态代理必须使用接口
- Spring的无接口代理实现AOP
- Spring之AOP的实现(JDK动态代理:只能代理接口,不能代理类)
- 利用RIL代理接口实现短信的操作之短信的接收
- Dubbo原理实现之代理接口的定义
- Mybatis Mapper动态代理方法 即 只写Dao接口 不谢Dao的实现类
- Mybatis总结2使用动态代理 实现接口
- 利用RIL代理接口实现短信的操作之短信的接收
- java反射和动态代理实现接口记录
- 由service层接口有什么用?引申到基于JDK原生和CGLIB动态代理实现spring事务管理的机制的思考
- mybatis CRUD之Mapper代理开发模式(接口实现 不需要实现类)
- spring aop怎么给Mybaits Mapper接口的代理实现类在进行代理
- mybatis中接口没有实现类的动态代理探究
- 使用CGLib代理无实现类的接口
- 模仿mybatis,用jdk proxy实现接口
- Java动态代理实现接口invocationHandler
- Mybatis Mapper动态代理方法 即 只写Dao接口 不写Dao的实现类