`

JDK代理的应用及优化示例

    博客分类:
  • JDK
阅读更多
1. 首先定义一个接口.
package proxy;
/** 
 *  操作接口
 *  version 1.0 Jul 15, 2010
 */
public interface ITarget {
	
	/**
	 *  操作方法
	 */
	public void operator();
	
}

2. 再定义一个接口的实现类
package proxy.impl;

import proxy.ITarget;

public class Target implements ITarget { 

	@Override
	public void operator() {
		// TODO Auto-generated method stub
		System.out.println(">>>正在调用Targer.operator()方法!"); 
	}

}

我们使用面向接口编程,最简单的调用方式是[1]
		ITarget it=new Target();
		it.operator();

然而使用这种调用方式使得接口和实现通过硬编码的方式耦合在了一起.
JDK动态代理可以生成一个代理对象.
3.  创建JDK动态代理Handler[2]
package proxy.handler;

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

public class MethodHandler implements InvocationHandler {

	private Object targetObject;

	public Object newProxy(Object targetObject) {
		this.targetObject = targetObject;
		return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
				targetObject.getClass().getInterfaces(), this);
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		// TODO Auto-generated method stub
		Object ret = null;
		try {
			ret = method.invoke(this.targetObject, args);
		} catch (Exception e) {
			e.printStackTrace();
			throw new java.lang.RuntimeException(e);
		}
		return ret;
	}
}


4. 创建调用接口.
                  MethodHandler handler=new MethodHandler();
		ITarget ii=(ITarget)handler.newProxy(new Target());
		ii.operator();


看到这里我发现了,当我们调用Spring中的getBean(),他会返回一个初始化好的实例给你.
IOC很简单的把程序的耦合[1],移到了配置文件ApplicationContext.xml当中;当我们调用Spring中的AOP时,他会返回一个初始化好的实例给你,但是这个实例是一个JKDProxy,这样就可以在invoke中添加一些自定义的行为[2].
总结:约定优于配置,我们完全可以跳过JDK的动态代理来实现完全基于IOC的“伪”动态代理,规则如下:
存储路径规则:
proxy:存储接口
proxy.impl:存储接口的实现类
类名定义规则:
ITarget:接口类名
Target:接口实现类名
注意:接口的类名必须以"I"开头,后面符合Java命名规范,实现类必须为接口名称去掉"I".
5. "伪"动态代理
package proxy.handler;

public class ChgHandler {
	
	public Object invoke(Class interfaceName) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
		String path=interfaceName.getName();
		int point=path.lastIndexOf(".");
		String pack=path.substring(0,point);
		String clsname=path.substring(point+1);
		String proxyimpl=pack.concat(".impl");
		String proxynameimpl=clsname.replaceFirst("I", "");
		String proxyName=proxyimpl.concat(".").concat(proxynameimpl);
		Class<?>  proxyclass=Class.forName(proxyName);
		return proxyclass.newInstance();
	}

}


6. 对伪代理的调用
ChgHandler chgh=new ChgHandler();
		ITarget hh=(ITarget) chgh.invoke(ITarget.class);
		hh.operator();

这样可以替代JDK动态代理,而且其实现效率更高,不需要Spring配置,只需要通过这个"伪"代理就可以实现从接口到实现的转换,其出错的概率也更低.
当然我这里给出的只是一个简单的范例,代码也是草草,不能和Spring这强大的框架相比,但是其效率绝对是最高的.
这里还有很多需要完善的,比如说代理对象有复杂的对象作为其输入参数,还有日志及其异常处理等等.
分享到:
评论

相关推荐

    JDK的动态代理总结

    这篇博客将对JDK的动态代理进行深入的总结,探讨其原理、使用场景以及实际应用。 首先,我们要了解JDK动态代理的核心类——`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`。`Proxy`类用于生成...

    基于java的企业级应用开发:JDK动态代理.ppt

    本篇主要探讨的是基于Java的两种动态代理机制:JDK动态代理和CGLIB代理,它们在Spring框架中的应用,以及与Hibernate二级缓存的关联。 首先,JDK动态代理是通过`java.lang.reflect.Proxy`类来实现的。这个类提供了...

    Webservice入门教程_用JDK开发Webservice示例代码

    Webservice是一种基于网络的、开放式的信息交换标准,它允许不同系统之间进行数据交换,实现应用程序之间的互操作性。本教程将带你入门Webservice的开发,特别聚焦于使用JDK(Java Development Kit)来构建...

    jdk源码包jdk-11.0.1

    2. **jdk.management.agent**:这部分源码涉及到JDK的管理代理,它提供了一种标准的方式来管理和监控Java应用程序。通过Java Management Extensions (JMX),开发者可以获取运行时信息,如内存使用、线程状态等。 3....

    JDK1.8和JDK1.6API帮助文档

    对于JDK 1.8和J.6,开发者可以通过这些文档了解各个类和接口的功能、用法以及示例,从而更好地利用它们进行软件开发。无论是初学者还是经验丰富的开发者,都应该充分利用这些API文档,以提高编程效率和代码质量。

    jdk1.6_64位官方下载

    JDK1.6,也称为Java SE 6,是Java平台的一个重要版本,它包含Java编译器、Java运行时环境(JRE)、调试器、文档、示例程序以及各种实用工具。在本案例中,我们讨论的是JDK1.6的64位版本,具体为JDK1.6.0_45,这是一...

    JDK1.6中文API

    5. **动态代理(Dynamic Proxies)**:JDK1.6对动态代理进行了优化,使得开发者能够更容易地创建满足特定接口的动态代理对象,用于实现AOP(面向切面编程)或者事件监听等功能。 6. **改进的日志框架**:JDK1.6中的...

    JDK1.6(中)与JDK1.8中英

    JDK,全称为Java Development Kit,是Oracle公司提供的用于开发和运行Java应用程序的工具集合。它包括Java编译器、Java虚拟机(JVM)、Java类库以及各种开发工具,如Javadoc和JAR打包工具等。JDK的版本更新通常会...

    JDK 1.6中文文档

    3. **改进的Swing组件**:JDK 1.6对Swing库进行了优化,包括更快的渲染速度,新的布局管理器,以及更好的国际化支持。 4. **NIO.2**:新增了`java.nio.file`包,提供了异步文件操作,增强了文件系统访问能力。 5. ...

    jdk5 webservice demo

    9. **性能优化**: 针对大规模的Web服务应用,JDK 5的JAX-WS支持服务端的多线程处理,以及通过缓存和HTTP连接池等方式提升性能。 10. **测试工具**: 可以使用`wsdl2java`工具生成客户端代码,并利用`soapUI`等工具...

    jdk_api_1_6中文版

    1. 改进的性能:JDK 1.6通过优化虚拟机(JVM)和编译器,提高了应用程序的运行效率,尤其是在垃圾回收和内存管理方面。 2. 动态代理:Java语言增加了动态代理类的生成,使得开发者可以方便地创建代理对象,实现对原...

    JDK_API_1.6

    j2se6.chm是Java SE 6的官方帮助文档,通常包含了API详细说明、教程和示例,是开发者查阅和学习JDK 1.6的重要参考资料。 总结起来,JDK 1.6作为Java发展中的一个重要阶段,其API的丰富和改进极大地推动了Java应用的...

    JDK6API中文参考手册

    2. **动态代理**:JDK6引入了`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口,支持在运行时创建具有指定方法调用行为的代理类,这对于实现AOP(面向切面编程)和事件监听等场景非常有用。...

    最新jdk api1.8英文版和jdk api1.6中文版

    此外,JDK 1.6还优化了垃圾收集器,提升了性能,并引入了泛型的完全支持,使得类型安全性和代码可读性得到显著提升。 两者之间的主要区别在于语言特性和库的更新。JDK 1.8在许多方面都比1.6更加现代化,特别是其...

    jdk1.6.0_45-zjt.zip

    4. **改进的垃圾回收**:JDK 1.6的垃圾回收器进行了优化,提高了应用程序的响应速度和内存利用率,特别是对于服务器端应用。 5. **并发工具**:Java Concurrency API得到了扩展,添加了如`ConcurrentHashMap`和`...

    JDK1.6 API帮助文档.zip

    **JDK1.6 API帮助文档** JDK1.6 API帮助文档是Java开发者的重要参考资料,它详尽地列出了Java SE 6平台的核心类库,包括...文档中的类、接口和方法都配有详细的说明和示例,是学习和开发Java SE 6应用程序的必备参考。

    jdk 11 中文版 api.zip

    JDK(Java Development Kit)是Oracle公司发布的用于开发Java应用程序的软件开发工具包,它是Java开发环境的基础。JDK包含了Java运行时环境(JRE)、Java编译器(javac)、Java文档生成器(javadoc)以及一系列的...

    JDK API 1.6.0 中文版

    API文档是学习和开发Java应用不可或缺的一部分,它提供了丰富的示例代码、类结构和方法说明,有助于提升开发效率和代码质量。 **JDK API 1.6.0** 的主要特点和关键知识点包括: 1. **核心类库增强**:JDK 1.6.0在...

    java jdk1.6 新特性 jaxb2 demo

    Java JDK 1.6是Java开发工具包的一个重要版本,发布于2006年,引入了许多增强功能和新特性,极大地提升了开发效率和应用程序性能。JAXB(Java Architecture for XML Binding)2.0是在这个版本中得到广泛推广的一个...

Global site tag (gtag.js) - Google Analytics