`

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实例化一个抽象类对象的方法教程

    例如,你可以定义一个注解`@MockApi`,然后在处理器中分析带有这个注解的类,生成一个新的实现类,这个新类将包含原始抽象类和接口的实现。 总的来说,虽然Java中的抽象类不能直接实例化,但我们可以通过继承并实现...

    接口+抽象类+代理的简单例子

    抽象类是一个不能实例化的类,它通常包含抽象方法(没有具体实现的方法)和非抽象方法(有实现的方法)。抽象类是为了解决接口不能提供具体实现的问题。子类继承抽象类时,必须实现所有抽象方法,或者本身也声明为...

    抽象类与接口的区别

    在Java编程语言中,抽象类和接口是两个重要的概念,它们在面向对象设计中扮演着重要角色。要深入理解它们的区别,首先需要知道什么是抽象类以及什么是接口。 抽象类是指在面向对象的概念中,如果一个类无法表示出...

    利用Java的反射与代理实现IOC模式

    Java的反射机制是Java编程语言的核心特性之一,它...总的来说,理解Java的反射和动态代理机制对于深入学习Spring框架,尤其是其IOC和AOP机制至关重要。通过掌握这些技术,开发者可以构建出更加灵活、可扩展的Java应用。

    Java代理模式Java动态代理

    无论是通过代理模式控制对象的访问,还是利用Java动态代理实现特定时刻的行为增强,都是在不改变现有代码结构的前提下实现功能扩展的有效手段。这对于提高代码的可维护性和灵活性具有重要意义。

    设计模式之代理模式Java实现和类设计图

    首先,我们需要定义一个接口或抽象类,这个接口或抽象类将被原对象和代理对象共同实现。然后,创建一个代理类,该类同样实现该接口或继承该抽象类,代理类中持有对原对象的引用,并在代理类的方法中调用原对象的方法...

    23三种设计模式java实现

    Java中,通过接口和实现类实现策略的封装和选择。 - **模板方法模式**:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。Java中,通过抽象类定义模板方法,子类实现具体步骤。 - **观察者模式**:定义对象间...

    Java动态代理详解; CGLib实现动态代理1

    在静态代理中,我们通常会定义一个抽象主题接口(ISubject),然后创建真实主题类(RealSubject)来实现这个接口,接着创建代理类(Proxy)也实现该接口,并持有真实主题类的引用。代理类在调用真实对象方法时可以...

    java调用soap接口案例

    Java调用SOAP(Simple Object Access Protocol)接口是Web服务交互中的常见操作,SOAP是一种基于XML的协议,用于在Web上交换结构化的和类型化的信息。本案例主要关注如何使用Java来实现SOAP请求并获取响应,具体我们...

    Java抽象工厂设计模式的研究与实现.pdf

    2. 抽象工厂模式提供了一种解决方案,以便在不指定具体实现类的情况下,创建复杂对象的家族。 3. 抽象工厂模式能够使系统更加灵活、可维护和可扩展。 在Java抽象工厂设计模式中,抽象工厂模式是通过工厂接口来定义...

    Java动态代理[动态类Proxy的使用]

    - 代理对象只能实现接口,不能代理抽象类或具体类。 - 代理类的生成是在运行时完成的,所以如果需要编译时检查,例如在泛型或静态方法中使用,可能需要额外的处理。 - 代理类的方法调用会有一定的性能开销,因此...

    java接口学习笔记

    Java语言为了保持简单性和一致性,不支持多继承,即一个类不能同时继承多个父类。然而,Java提供了接口的概念作为多继承的一个替代方案。通过实现多个接口,一个类可以间接地支持多继承,这使得类可以继承并实现多个...

    java LAN使用代理服务器

    `Proxy`类是Java中表示网络代理的抽象类,它可以是HTTP、SOCKS或任何其他类型的代理。你可以通过以下方式创建一个`Proxy`对象: ```java Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(...

    java动态代理机制

    Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现特定接口,从而可以灵活地扩展或增强已有代码的功能。在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `...

    Java中动态代理的介绍及实例

    - **抽象角色**:通常指接口或抽象类,定义了真实对象和代理对象需要遵循的行为规范。 - **代理角色**:实现了抽象角色定义的接口,内部包含对真实对象的引用,能够在调用真实对象方法的同时添加额外的功能,如日志...

    java常用设计模式-代理模式

    静态代理需要定义一个接口或抽象类,代理对象和被代理对象需要实现相同的接口或者继承相同的父类。例如,在上面的例子中,我们定义了一个接口 `IHello`,然后创建了一个实现类 `HelloImpl`,最后创建了一个静态代理...

    JAVA_API1.6文档(中文)

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

    Java中三种代理模式源码+文档

    这种方式需要为每个被代理的对象创建一个对应的代理类,代码量相对较大,但易于理解和实现。示例代码如下: ```java // 定义接口 interface Service { void doSomething(); } // 实现接口的真实对象 class ...

    Java反射与动态代理

    5. **处理泛型信息**:虽然编译后的Java类不包含泛型信息,但反射可以在运行时获取泛型的实际类型。 6. **实现插件化和框架设计**:许多框架如Spring、Hibernate都大量使用反射,实现动态配置和代码解耦。 动态代理...

    23种设计模式的java实现源代码.rar

    Java中通常使用接口和具体实现类来构建。 4. **建造者模式(Builder)**:将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。Java中通常通过建造者类和导向器类实现。 5. **原型模式...

Global site tag (gtag.js) - Google Analytics