Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Aspectj。在多个类中创建innter类型的方法_Java_Aspectj_Aop_Aspects - Fatal编程技术网

Java Aspectj。在多个类中创建innter类型的方法

Java Aspectj。在多个类中创建innter类型的方法,java,aspectj,aop,aspects,Java,Aspectj,Aop,Aspects,如果我说: public CountryState CountryState.find(long id) { return (CountryState) findById(CountryState.class, id); } 我正在创建一个在CountryState类中查找的方法 有没有办法在几个类中创建一个方法?我需要为我想要创建的每个类重复代码吗 我知道使用aspect可以使一个类从另一个继承,但是,这样做,我可以创建一个超类,因为java不接受多重继承。您实际上可以不使用

如果我说:

public CountryState CountryState.find(long id) {
        return (CountryState) findById(CountryState.class, id);
}
我正在创建一个在CountryState类中查找的方法

有没有办法在几个类中创建一个方法?我需要为我想要创建的每个类重复代码吗


我知道使用aspect可以使一个类从另一个继承,但是,这样做,我可以创建一个超类,因为java不接受多重继承。

您实际上可以不使用AOP来解决它。您可以使用OOP/OOD。有两种方法(我假设您只想编写一次方法):

  • 使用方法实现创建抽象基类,并从中派生所有类。事实上,这不是最好的主意

  • 创建将实现find()方法并在类之间共享它的帮助器类(使用依赖项注入,或者仅仅通过紧密耦合它们)

  • 因此,如果我理解正确,您实际上需要的是一个泛型方法,该方法将返回目标类的实例:

    public <T> find(long id, T targetClassObject) {
      Class<? extends T> class = targetClassObject.getClass();
      // do something i.e. call target method via reflection
    }
    
    public find(长id,T targetClassObject){
    
    类此“模式”是在AspectJ中执行此操作的方式

    声明一个接口:

    interface Holder {}
    
    public int Holder.getMeAnInt() {
      return 42;
    }
    
    declare parents: @Anno * implements Holder;
    
    在接口上进行类型间声明:

    interface Holder {}
    
    public int Holder.getMeAnInt() {
      return 42;
    }
    
    declare parents: @Anno * implements Holder;
    
    当你在一个接口上做出这样的声明时,你提供的是一个“默认实现”。因此该接口现在将定义getMeAnInt(),任何未实现getMeAnInt()的Holder实现都将获得默认实现

    最后一个难题是使用declare parents指定实现接口的类型组:

    interface Holder {}
    
    public int Holder.getMeAnInt() {
      return 42;
    }
    
    declare parents: @Anno * implements Holder;
    
    所以现在,任何带有@Anno注释的类型都将实现Holder并具有getMeAnInt()方法。

    请参阅我的第二篇文章。