2017-03-07 4 views
2

Ich bin seit gestern hier auf der Suche nach einer Möglichkeit, dies zu tun. Was ich habe, sind Hunderte von POJOs von einer dritten Partei und müssen Eigenschaften basierend auf Geschäftsregeln auf diese anwenden. Ich vermeide die Veränderung der POJOs, weil die dritte Partei sie potenziell neu erstellen könnte und somit einen Albtraum für die Verwaltung von Dateien auf der Straße schafft.JAVA Ist es möglich, dynamisch eine Klasse zu erweitern?

Was ich versuche zu tun ist, dynamisch eine Klasse zu haben, eine andere Klasse zu erweitern. Zum Beispiel.

POJO: Foo.java

package abc.service; 

public class Foo { 
    private String greeting = ""; 

    public Foo(){ 
     gretting = "Good morning"; 
    } 

    public String getGreeting(){ 
     return greeting; 
    } 
} 
// end file 

Mine: Bar.java

package abc.service; 

public class Bar { 
    private String claim = ""; 

    public Bar(){ 
     claim = "You're correct"; 
    } 

    public String getClaim(){ 
     return claim; 
    } 
} 
// end file 

Mine: TestMe.java

hier in einer Klasse Der Versuch, getrennt von der POJOs, die ein POJO haben, erweitern einen anderen meiner Klassen.

Ist das jenseits der Fähigkeiten von JAVA?

Darüber hinaus ist, dass JSON-Schemas von den bereitgestellten POJOs erstellt werden. Die POJOs basieren jedoch nur auf einem UPDATE-Record-Szenario. Ich bin auf der Suche nach dem besten Weg, um die POJOs eine weitere Klasse für CREATE-Record-Szenarien zu erweitern, weshalb ich meine POJOs dynamisch erweitern möchte, um meinen Code bei Bedarf zu erweitern.

  • Need json Schema für die POJOs für UPDATE
  • Müssen die Überprüfung ihrer json erfüllt die POJOs Anforderungen für UPDATE
  • benötigen ihre json den POJOs für UPDATE konvertieren

auch zur Erzeugung von ,

  • Need json Schema für die POJOs zu erzeugen, für CREATE
  • zu überprüfen, ihre json benötigen erfüllt die POJOs Anforderungen für CREATE
  • benötigen ihre json den POJOs zu konvertieren für
  • CREATE

Mit Jackson Mixin und die ObjectMapper Ich bin in der Lage, dynamisch auf die Klassen meinen Code anwenden Beim Erstellen der Schemas ist das Problem, das ich habe, wenn versucht wird, dass die POJOs die Klasse erweitern, in der Mixin das Problem nicht lösen wird.

+1

Nein (und ich habe mindestens 13 Zeichen zu geben, so) ... Nein –

+0

Versuchte Schnittstellen oder abstrakte Klasse verwenden? –

+0

@EngineerDollery Ich hoffe doch, dass es möglich ist, sonst würden spöttische Frameworks nicht funktionieren ;-) –

Antwort

1

Es ist nicht möglich.

Einfach gesagt, JAVA zur Zeit (bis zur letzten Version) hat keine Möglichkeit, die Klasse zur Laufzeit dynamisch zu erweitern und auf JVM zu laden.

5

Mit Plain Java: Nein, es kann nicht getan werden.

Sie können den Byte-Code entweder im Build-Prozess oder zur Laufzeit ändern.Aber es ist schwer und es gibt nicht viel Dokumentation.

AspectJ declare parents Ausdruck ist wahrscheinlich der einfachste Weg, um es zur Build-Zeit zu tun.

Wenn Sie es zur Laufzeit tun möchten, betrachten Sie Frameworks wie ASM, CGLib oder ByteBuddy. Sie müssen den Code jedoch in einem benutzerdefinierten ClassLoader oder Agenten ausführen.

0

Anstatt zu erweitern, sollten Sie ein Designmuster verwenden. Zum Beispiel die Stategy Pattern. Auf diese Weise können Sie Ihre Strategie dynamisch ändern.

4

Sie können Komposition statt Vererbung verwenden.

public class Foo { 
    private String greeting = ""; 

    public Foo(){ 
     gretting = "Good morning"; 
    } 

    public String getGreeting(){ 
     return greeting; 
    } 
} 

Ihre Klasse

public class Bar { 
    private String claim = ""; 
    private Foo foo; 

    public Bar(){ 
     claim = "You're correct"; 
     foo = new Foo(); 
    } 

    public String getClaim(){ 
     return claim; 
    } 

    public Foo getFoo(){ 
     return foo; 
    } 
} 

Und der Test

public class TestMe { 

    // Trying to call the Foo method 
    System.out.println(bar.getFoo().getGreeting()); 
    // Trying to call the Bar method 
    System.out.println(bar.getClaim()); 
} 

Oder Sie können unterschiedliche Sie Klasse ein wenig tun.

public class Bar { 
     private String claim = ""; 
     private Foo foo; 

     public Bar(){ 
      claim = "You're correct"; 
      foo = new Foo(); 
     } 

     public String getClaim(){ 
      return claim; 
     } 

     public String getGreeting(){ 
      return foo.getGreeting(); 
     } 
    } 

Und der Test

public class TestMe { 

    // Trying to call the Foo method 
    System.out.println(bar.getGreeting()); 
    // Trying to call the Bar method 
    System.out.println(bar.getClaim()); 
} 
Verwandte Themen