原文链接: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实现就可以使用这种方式了。
相关推荐
例如,你可以定义一个注解`@MockApi`,然后在处理器中分析带有这个注解的类,生成一个新的实现类,这个新类将包含原始抽象类和接口的实现。 总的来说,虽然Java中的抽象类不能直接实例化,但我们可以通过继承并实现...
抽象类是一个不能实例化的类,它通常包含抽象方法(没有具体实现的方法)和非抽象方法(有实现的方法)。抽象类是为了解决接口不能提供具体实现的问题。子类继承抽象类时,必须实现所有抽象方法,或者本身也声明为...
在Java编程语言中,抽象类和接口是两个重要的概念,它们在面向对象设计中扮演着重要角色。要深入理解它们的区别,首先需要知道什么是抽象类以及什么是接口。 抽象类是指在面向对象的概念中,如果一个类无法表示出...
Java的反射机制是Java编程语言的核心特性之一,它...总的来说,理解Java的反射和动态代理机制对于深入学习Spring框架,尤其是其IOC和AOP机制至关重要。通过掌握这些技术,开发者可以构建出更加灵活、可扩展的Java应用。
无论是通过代理模式控制对象的访问,还是利用Java动态代理实现特定时刻的行为增强,都是在不改变现有代码结构的前提下实现功能扩展的有效手段。这对于提高代码的可维护性和灵活性具有重要意义。
首先,我们需要定义一个接口或抽象类,这个接口或抽象类将被原对象和代理对象共同实现。然后,创建一个代理类,该类同样实现该接口或继承该抽象类,代理类中持有对原对象的引用,并在代理类的方法中调用原对象的方法...
Java中,通过接口和实现类实现策略的封装和选择。 - **模板方法模式**:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。Java中,通过抽象类定义模板方法,子类实现具体步骤。 - **观察者模式**:定义对象间...
在静态代理中,我们通常会定义一个抽象主题接口(ISubject),然后创建真实主题类(RealSubject)来实现这个接口,接着创建代理类(Proxy)也实现该接口,并持有真实主题类的引用。代理类在调用真实对象方法时可以...
Java调用SOAP(Simple Object Access Protocol)接口是Web服务交互中的常见操作,SOAP是一种基于XML的协议,用于在Web上交换结构化的和类型化的信息。本案例主要关注如何使用Java来实现SOAP请求并获取响应,具体我们...
2. 抽象工厂模式提供了一种解决方案,以便在不指定具体实现类的情况下,创建复杂对象的家族。 3. 抽象工厂模式能够使系统更加灵活、可维护和可扩展。 在Java抽象工厂设计模式中,抽象工厂模式是通过工厂接口来定义...
- 代理对象只能实现接口,不能代理抽象类或具体类。 - 代理类的生成是在运行时完成的,所以如果需要编译时检查,例如在泛型或静态方法中使用,可能需要额外的处理。 - 代理类的方法调用会有一定的性能开销,因此...
Java语言为了保持简单性和一致性,不支持多继承,即一个类不能同时继承多个父类。然而,Java提供了接口的概念作为多继承的一个替代方案。通过实现多个接口,一个类可以间接地支持多继承,这使得类可以继承并实现多个...
`Proxy`类是Java中表示网络代理的抽象类,它可以是HTTP、SOCKS或任何其他类型的代理。你可以通过以下方式创建一个`Proxy`对象: ```java Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(...
Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现特定接口,从而可以灵活地扩展或增强已有代码的功能。在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `...
- **抽象角色**:通常指接口或抽象类,定义了真实对象和代理对象需要遵循的行为规范。 - **代理角色**:实现了抽象角色定义的接口,内部包含对真实对象的引用,能够在调用真实对象方法的同时添加额外的功能,如日志...
静态代理需要定义一个接口或抽象类,代理对象和被代理对象需要实现相同的接口或者继承相同的父类。例如,在上面的例子中,我们定义了一个接口 `IHello`,然后创建了一个实现类 `HelloImpl`,最后创建了一个静态代理...
javax.swing.plaf 提供一个接口和许多抽象类,Swing 用它们来提供自己的可插入外观功能。 javax.swing.plaf.basic 提供了根据基本外观构建的用户界面对象。 javax.swing.plaf.metal 提供根据 Java 外观(曾经代...
这种方式需要为每个被代理的对象创建一个对应的代理类,代码量相对较大,但易于理解和实现。示例代码如下: ```java // 定义接口 interface Service { void doSomething(); } // 实现接口的真实对象 class ...
5. **处理泛型信息**:虽然编译后的Java类不包含泛型信息,但反射可以在运行时获取泛型的实际类型。 6. **实现插件化和框架设计**:许多框架如Spring、Hibernate都大量使用反射,实现动态配置和代码解耦。 动态代理...
Java中通常使用接口和具体实现类来构建。 4. **建造者模式(Builder)**:将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。Java中通常通过建造者类和导向器类实现。 5. **原型模式...