Apache Commons BeanUtils

1. Overzicht

Apache Commons BeansUtils bevat alle tools die nodig zijn om met Java Beans te werken.

Simpel gezegd, een bean is een eenvoudige Java-klasse die velden, getters / setters en een constructor zonder argument bevat.

Java biedt mogelijkheden voor reflectie en introspectie om getter-setter-methoden te identificeren en deze dynamisch aan te roepen. Deze API's kunnen echter moeilijk te leren zijn en vereisen mogelijk dat ontwikkelaars standaardcode schrijven om de eenvoudigste bewerkingen uit te voeren.

2. Maven afhankelijkheden

Hier is de Maven-afhankelijkheid die moet worden opgenomen in het POM-bestand voordat u het gebruikt:

 commons-beanutils commons-beanutils 1.9.3 

De nieuwste versie is hier te vinden.

3. Creëren van een Java Bean

Laten we twee bonenklassen maken Cursus en Leerling met typische getter- en setter-methoden.

openbare klas Cursus {privé Stringnaam; privélijstcodes; private Map enrolledStudent = nieuwe HashMap (); // standaard getters / setters} 
openbare klas Student {privé Stringnaam; // standaard getters / setters}

We hebben een Cursus klas met een cursusnaam, cursuscodes en meerdere ingeschreven studenten. Ingeschreven studenten worden geïdentificeerd door een unieke inschrijving-ID. Cursus klas handhaaft ingeschreven studenten in een Kaart object waarbij inschrijving-ID een sleutel is, en het studentobject de waarde is.

4. Toegang tot eigendom

Bean-eigenschappen kunnen worden onderverdeeld in drie categorieën.

4.1. Eenvoudige eigenschap

Eigenschappen met een enkele waarde worden ook wel eenvoudig of scalair genoemd.

Hun waarde kan een primitief (zoals int, float) of complex type-object zijn. BeanUtils heeft een PropertyUtils klasse waarmee we eenvoudige eigenschappen in een Java Bean kunnen wijzigen.

Hier is de voorbeeldcode om de eigenschappen in te stellen:

Cursuscursus = nieuwe cursus (); String name = "Computerwetenschappen"; Lijstcodes = Arrays.asList ("CS", "CS01"); PropertyUtils.setSimpleProperty (cursus, "naam", naam); PropertyUtils.setSimpleProperty (cursus, "codes", codes);

4.2. Geïndexeerde eigenschap

Geïndexeerde eigenschappen hebben een verzameling als een waarde die individueel toegankelijk is met behulp van een indexnummer. BeanUtils beschouwt als een uitbreiding op JavaBean java.util.List typ ook waarden zoals geïndexeerd.

We kunnen de individuele waarde van een geïndexeerde eigenschap wijzigen met behulp van een PropertyUtils'ssetIndexedProperty methode.

Hier is een voorbeeld van een code die de geïndexeerde eigenschap wijzigt:

PropertyUtils.setIndexedProperty (cursus, "codes [1]", "CS02");

4.3. Toegewezen eigenschap

Elke eigenschap met een java.util.Map aangezien het onderliggende type een toegewezen eigenschap wordt genoemd. Met BeanUtils kunnen we de individuele waarde in een kaart bijwerken met behulp van een String-gewaardeerd sleutel.

Hier is de voorbeeldcode om de waarde in een toegewezen eigenschap te wijzigen:

Student student = nieuwe student (); String studentName = "Joe"; student.setName (studentName); PropertyUtils.setMappedProperty (cursus, "enrolledStudent (ST-1)", student);

5. Toegang tot geneste eigendommen

Als een eigenschapswaarde een object is en we toegang moeten hebben tot een eigenschapswaarde binnen dat object, dan is dat toegang tot een geneste eigenschap. PropertyUtils ons toegang geven tot en geneste eigenschappen wijzigen ook.

Stel dat we toegang willen hebben tot de eigenschap name van Leerling klas door Cursus voorwerp. We zouden kunnen schrijven:

String name = course.getEnrolledStudent ("ST-1"). GetName ();

We hebben toegang tot de geneste eigenschapswaarden met getNestedProperty en wijzig de geneste eigenschap met setNestedProperty methoden in PropertyUtils. Hier is de code:

Student student = nieuwe student (); String studentName = "Joe"; student.setName (studentName); String nameValue = (String) PropertyUtils.getNestedProperty (cursus, "enrolledStudent (ST-1) .naam");

6. Kopieer de booneigenschappen

Het kopiëren van eigenschappen van het ene object naar een ander object is vaak vervelend en foutgevoelig voor ontwikkelaars. BeanUtils klasse biedt een copyProperties methode die de eigenschappen van het bronobject naar het doelobject kopieert waarbij de eigenschapsnaam in beide objecten hetzelfde is.

Laten we nog een bonenklasse maken als Cursus we hebben hierboven gemaakt met dezelfde eigenschappen, behalve dat het niet zal hebben ingeschrevenStudent eigenschap in plaats daarvan zal de eigenschapnaam zijn studenten. Laten we die klas een naam geven CourseEntity. De klas zou er als volgt uitzien:

openbare klasse CourseEntity {private String naam; privélijstcodes; privékaartstudenten = nieuwe HashMap (); // standaard getters / setters}

Nu gaan we de eigenschappen van Cursus bezwaar maken tegen CourseEntity voorwerp:

Cursus cursus = nieuwe cursus (); course.setName ("Computerwetenschappen"); course.setCodes (Arrays.asList ("CS")); course.setEnrolledStudent ("ST-1", nieuwe student ()); CourseEntity courseEntity = nieuwe CourseEntity (); BeanUtils.copyProperties (courseEntity, course);

Onthoud dat hierdoor alleen de eigenschappen met dezelfde naam worden gekopieerd. Daarom wordt de eigenschap niet gekopieerd ingeschrevenStudent in Cursus class omdat er geen eigenschap met dezelfde naam in CourseEntity klasse.

7. Conclusie

In dit korte artikel hebben we de hulpprogramma-klassen besproken die worden geboden door BeanUtils. We hebben ook gekeken naar verschillende soorten eigenschappen en hoe we toegang kunnen krijgen tot hun waarden en deze kunnen wijzigen.

Ten slotte hebben we gekeken naar toegang tot geneste eigenschapswaarden en het kopiëren van eigenschappen van het ene object naar een ander object.

Natuurlijk stellen reflectie en introspectie-mogelijkheden in de Java SDK ons ook in staat om dynamisch toegang te krijgen tot eigenschappen, maar het kan moeilijk te leren zijn en vereist enige standaardcode. BeanUtils stelt ons in staat om deze waarden te openen en te wijzigen met een enkele methodeaanroep.

Codefragmenten zijn te vinden op GitHub.


$config[zx-auto] not found$config[zx-overlay] not found