【问题标题】:How to implement object proxy or Class proxy in Java?如何在 Java 中实现对象代理或类代理?
【发布时间】:2015-10-05 23:08:19
【问题描述】:

我需要在我的项目中扩展一个 .class 文件,并且需要覆盖一个简单的方法。考虑我在某个 .jar 包中有 A 类。现在我想覆盖 A 类的 test() 方法。我使用创建 A 的子类 B 并覆盖它。 现在在我的应用程序包(它是 .jar)中为 A 类创建对象。该对象调用 A 类的方法。但我想调用 B 类方法。

我的想法是在整个应用程序中代理对象创建。每当创建 A 类的 obj 时,我想要进行一些配置来创建 B 类的对象并移交给 A 类发起。

请有人帮我实现这种机制。

【问题讨论】:

    标签: java spring proxy-classes dynamic-class-loaders proxy-object


    【解决方案1】:

    只有当构造函数是private时,你才能阻止或控制类的实例化。

    如果不能覆盖原来的基类,又想代理它,就需要一个工厂,建议程序员使用工厂,而不是直接调用基类的构造函数。

    在工厂代码中,您可以返回一个作为基类代理运行的子类。

    请记住,这只是一个建议。你不能阻止程序员 使用公共构造函数手动创建类的实例。

    【讨论】:

    • 你能在spring bean factory中为上述想法提供简单的工作示例
    【解决方案2】:

    以下是简单的方法(使用类型转换),通过它我们可以使用父类对象调用子类方法:

    package testA;
    
    public class A 
    {
    
        public static void main(String[] args) 
        {
            System.out.println("Hello World!");
        }
    
        public String aMethod(){
            System.out.println("Calling aMethod");
            return "aMethod";
        }
    }
    
    
    
    package testB;
    import testA.*;
    
    public class B extends A
    {
    
        public static void main(String[] args) 
        {
            System.out.println("Hello World!");
            A aClass = new B();
            aClass.aMethod();
            ((B)aClass).bMethod();
        }
    
        public String bMethod(){
            System.out.println("calling B method");
            return "bMethod";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 2017-06-17
      相关资源
      最近更新 更多