`

java对于接口和抽象类的代理实现,不需要有具体实现类

    博客分类:
  • java
 
阅读更多

原文链接:http://www.javaarch.net/jiagoushi/835.htm

 

java对于接口和抽象类的代理实现,不需要有具体实现类



在某些场景下,可能我们只需要定义接口或者抽象类,而具体实现或者可以从接口的annotation就可以知道具体实现,后者具体实现由其他动态语言实现,或者需要实现AOP的一些其他功能,我们不需要具体实现,那么我们有哪些方法可以来实现这样的功能呢?


1.使用java.lang.reflect.Proxy代理类

 

	import java.awt.event.ActionListener;
	import java.lang.reflect.InvocationHandler;
	import java.lang.reflect.Method;
	import java.lang.reflect.Proxy;


	public class ProxyTest {

		public static void main(String[] args) {

			ClassLoader cl = ProxyTest.class.getClassLoader();
			Class[] interfaces = new Class[]{ ActionListener.class };
			
			Object object = Proxy.newProxyInstance(cl, interfaces, new InvocationHandler() {

				public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

					String name = method.getName();

					if(name.equals("toString")) {
						
						return "toString was called";
					}
					else if(name.equals("actionPerformed")) {
						
						System.out.println("actionPerformed was called");
						
						return null;
					}

					throw new RuntimeException("no method found");
				}
			});
			
		((ActionListener) object).actionPerformed(null);
		}
	}


输出:
   actionPerformed was called


2.通过javassist的javassist.util.proxy.ProxyFactory来实现

 

 

public class Test {

		public static void main(String[] args) throws Exception {

			ProxyFactory factory = new ProxyFactory();
		
				factory.setInterfaces(new Class[] { ActionListener.class });

				factory.setHandler(new MethodHandler() {
				
			public Object invoke(Object arg0, Method method, Method arg2, Object[] arg3) throws Throwable {
				
						String name = method.getName();

						if(name.equals("toString")) {
						
							return "toString was called";
						}
						else if(name.equals("actionPerformed")) {
						
						System.out.println("actionPerformed was called");
						
						return null;
						}

						throw new RuntimeException("no method found");
			}
			});
			
			Class c = factory.createClass();

			Object object = c.newInstance();
			 
			((ActionListener) object).actionPerformed(null);
		}
	}


这里主要的不同是factory.setSuperclass(MouseAdapter.class);这是设置抽象类接口


对于之前我们描述的http://blog.csdn.net/zhongweijian/article/details/8475086 利用spring AOP和Annotation来简化DAO实现就可以使用这种方式了。

 

0
4
分享到:
评论

相关推荐

    JAVA_API1.6文档(中文)

    javax.swing.plaf 提供一个接口和许多抽象类,Swing 用它们来提供自己的可插入外观功能。 javax.swing.plaf.basic 提供了根据基本外观构建的用户界面对象。 javax.swing.plaf.metal 提供根据 Java 外观(曾经代...

    Java 基础核心总结 +经典算法大全.rar

    接口和抽象类接口 抽象类异常 认 识 Exception 什么是 Throwable 常见的 Exception 与 Exception 有关的 Java 关键字 throws 和 throw try 、finally 、catch 什么是 Error 内部类 创建内部类集合 Iterable 接口顶层...

    设计模式(JAVA语言实现)--20种设计模式附带源码PPT模板.pptx

    12适配器接口模式:定义接口、抽象类和类重写适配器接口模式:定义接口、抽象类和类重写 设计模式(JAVA语言实现)--20种设计模式附带源码PPT模板全文共22页,当前为第13页。 logo 13策略模式:接口和多个实现策略...

    java api最新7.0

    javax.swing.plaf 提供一个接口和许多抽象类,Swing 用它们来提供自己的可插入外观功能。 javax.swing.plaf.basic 提供了根据基本外观构建的用户界面对象。 javax.swing.plaf.metal 提供根据 Java 外观(曾经代称为 ...

    JavaAPI1.6中文chm文档 part1

    javax.swing.plaf 提供一个接口和许多抽象类,Swing 用它们来提供自己的可插入外观功能。 javax.swing.plaf.basic 提供了根据基本外观构建的用户界面对象。 javax.swing.plaf.metal 提供根据 Java 外观(曾经代...

    java设计模式【之】静态代理【源码】【场景:帮爸爸买菜】.rar

    被代理对象与代理对象,需要实现相同的接口或继承相同的父类 * 2.代理对象聚合被代理对象 * 3.客户端,创建代理对象,创建被代理对象,把被代理对象传入代理对象中 * 4.客户端调用,代理对象的同名方法 * 代码...

    Java 1.6 API 中文 New

    javax.swing.plaf 提供一个接口和许多抽象类,Swing 用它们来提供自己的可插入外观功能。 javax.swing.plaf.basic 提供了根据基本外观构建的用户界面对象。 javax.swing.plaf.metal 提供根据 Java 外观(曾经代称为 ...

    java 面试题 总结

    接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它...

    java jdk-api-1.6 中文 chmd

    javax.swing.plaf 提供一个接口和许多抽象类,Swing 用它们来提供自己的可插入外观功能。 javax.swing.plaf.basic 提供了根据基本外观构建的用户界面对象。 javax.swing.plaf.metal 提供根据 Java 外观(曾经代...

    JavaAPI中文chm文档 part2

    javax.swing.plaf 提供一个接口和许多抽象类,Swing 用它们来提供自己的可插入外观功能。 javax.swing.plaf.basic 提供了根据基本外观构建的用户界面对象。 javax.swing.plaf.metal 提供根据 Java 外观(曾经代...

    疯狂JAVA讲义

    第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 ...11.8.1 Image抽象类和BufferedImage实现类 425 11.8.2 使用ImageIO输入/输出位图 427 11.9 剪贴板 432 11.9.1 数据传递的类...

    基于JAVA SMART系统-系统框架设计与开发(源代码+论文).zip

    Java程序设计语言提供了两种机制,可以用来定义一个允许多个实现的类型:接口和抽象类。两种机制之间最明显的区别是,抽象类允许包含某些方法的实现,但是接口是不允许的。一个更为重要的不同之处在于,为了实现一个...

    [Java参考文档]

    javax.swing.plaf 提供一个接口和许多抽象类,Swing 用它们来提供自己的可插入外观功能。 javax.swing.plaf.basic 提供了根据基本外观构建的用户界面对象。 javax.swing.plaf.metal 提供根据 Java 外观(曾经代...

    超级有影响力霸气的Java面试题大全文档

    接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它...

    (超赞)JAVA精华之--深入JAVA API

    1.10 抽象类与接口的区别 1.11 Java变量类型间的相互转换 2 JAVA与WEB 2.1 JMX规范 2.1.1 JMX概述 2.1.2 设备层(Instrumentation Level) 2.1.3 代理层 2.1.4 分布服务层 2.1.5 附加管理协议API 2.1.6 JMX的当前...

    java基础案例与开发详解案例源码全

    11.3 List接口实现类277 11.3.1 实现类ArrayList277 11.3.2 实现类LinkedList279 11.3.3 实现类Vector281 11.4 Map接口283 11.4.1 实现类HashMap284 11.4.2 实现类LinkedHashMap285 11.4.3 实现类TreeMap286 11.4.4 ...

    [Java参考文档].JDK_API 1.6

    javax.swing.plaf 提供一个接口和许多抽象类,Swing 用它们来提供自己的可插入外观功能。 javax.swing.plaf.basic 提供了根据基本外观构建的用户界面对象。 javax.swing.plaf.metal 提供根据 Java 外观(曾经代称为 ...

    Java常见面试题208道.docx

    14.接口和抽象类有什么区别? 15.java 中 IO 流分为几种? 16.BIO、NIO、AIO 有什么区别? 17.Files的常用方法都有哪些? 二、容器 18.java 容器都有哪些? 19.Collection 和 Collections 有什么区别? 20.List、Set...

    史上最全java面试,103项重点知识,带目录

    14. 接口和抽象类有什么区别? 7 15. java 中 IO 流分为几种? 7 16. BIO、NIO、AIO 有什么区别? 7 17. Files的常用方法都有哪些? 8 二、容器 8 18. java 容器都有哪些? 8 19. Collection 和 Collections 有什么...

Global site tag (gtag.js) - Google Analytics