我怎么知道创建实例的时间?

时间:2019-06-29 14:44:18

标签: java reflection

因此,我制作了一个简单的程序,使您可以创建大量类的实例。 现在,我负责将创建的实例发送到服务器。我真的很喜欢类的构造函数,所以我真的不想更改它们。 我该如何听这个程序,以便知道最近创建了哪些类,我在考虑使用反射和线程?

这是我想要完成的简短示例:

public class MainApplicaton{

     public static void main(String []args){
        ConnectServer.listenToCreatedInstances().
        new Vase();
        new Dog();
        new House();
     }
}

package stuff.components;
public class Human{
    public Human(){

    }
}

package stuff.components;
public class Dog{
    public Dog(){

    }
}

package stuff.components;
public class House{
    public House(){

    }
}

现在我的侦听器线程:

   public enum ConnectServer {
        Server;

        public void listenTocreatedIntances(){
            //Something happens here
            Class c ..
            System.out.println("A instance of "+c.getName());
        }
    }

2 个答案:

答案 0 :(得分:1)

一个相对简单的方法是引入一个公共的父类,并使用父类的构造函数来生成事件。子类构造函数始终调用父类构造函数。

package stuff.components;
class Component {
    public Component() {
        ConnectServer.Server.onInstanceCreated(this.getClass());
    }
}

class Human extends Component {
    public Human(){
        // implicit call to Component constructor
    }
}

class Dog extends Component{
    public Dog(){
        // implicit call to Component constructor    
    }
}

如果您想在不进行任何代码修改的情况下从实例创建中获取事件,则必须比Java更进一步。您的选择包括:

  • 面向方面的编程,例如Aspectj:当程序中发生某些特定事件(例如构造函数调用)时,它可以让您注入代码
  • 在运行时使用字节码操作库(例如ASM)将代码注入子类构造函数中

答案 1 :(得分:0)

回答这个问题的另一种方法是使用FactoryPattern。每次注册对象时,我们都会通知单例。

public class MainApplicaton{

     public static void main(String []args){
        Vase vase = new Vase();
        Dog dog = new Dog();
        House house = new House();
        ConnectServer.listenToCreatedInstances(vase);
        ConnectServer.listenToCreatedInstances(dog);
        ConnectServer.listenToCreatedInstances(house);
     }
}

在此Singleton中,我们将接收创建的元素并应用所需的行为。

public enum ConnectServer {
        Server;

        public void listenTocreatedIntances(Component component){
            //Something happens here
            System.out.println("A instance of "+component.getClass().getName());
        }
    }