logo

API de reflexió de Java

Reflexió de Java és un procés d'examinar o modificar el comportament en temps d'execució d'una classe en temps d'execució .

El java.lang.Class class proporciona molts mètodes que es poden utilitzar per obtenir metadades, examinar i canviar el comportament d'execució d'una classe.

Els paquets java.lang i java.lang.reflect proporcionen classes per a la reflexió de Java.

On s'utilitza

L'API de reflexió s'utilitza principalment a:

  • IDE (Entorn de desenvolupament integrat), per exemple, Eclipse, MyEclipse, NetBeans, etc.
  • Depurador
  • Eines de prova, etc.
Saps?
  • De quantes maneres podem obtenir la instància de Class class?
  • Com crear l'eina javap?
  • Com crear l'eina appletviewer?
  • Com accedir al mètode privat des de fora de la classe?

classe java.lang.Class

La classe java.lang.Class realitza principalment dues tasques:

què és 10 de 100
  • proporciona mètodes per obtenir les metadades d'una classe en temps d'execució.
  • proporciona mètodes per examinar i canviar el comportament d'execució d'una classe.

Mètodes utilitzats habitualment de classe Class:

MètodeDescripció
1) cadena pública getName()retorna el nom de la classe
2) La classe estàtica pública forName(String className) llança ClassNotFoundExceptioncarrega la classe i retorna la referència de Class class.
3) Public Object newInstance() llança InstantiationException, IllegalAccessExceptioncrea una nova instància.
4) booleà públic isInterface()comprova si és una interfície.
5) booleà públic isArray ();comprova si és una matriu.
6) booleà públic isPrimitive()comprova si és primitiu.
7) classe pública getSuperclass()retorna la referència de classe de superclasse.
8) Public Field[] getDeclaredFields() llança SecurityExceptionretorna el nombre total de camps d'aquesta classe.
9) Public Method[] getDeclaredMethods() llança SecurityExceptionretorna el nombre total de mètodes d'aquesta classe.
10) Public Constructor[] getDeclaredConstructors() llança SecurityExceptionretorna el nombre total de constructors d'aquesta classe.
11) El mètode públic getDeclaredMethod(String name,Class[] parameterTypes) llança NoSuchMethodException,SecurityExceptionretorna la instància de la classe del mètode.

Com obtenir l'objecte de la classe Class?

Hi ha 3 maneres d'obtenir la instància de Class class. Són els següents:

  • mètode forName() de la classe Class
  • mètode getClass() de la classe Object
  • la sintaxi .class

1) mètode forName() de la classe Class

  • s'utilitza per carregar la classe de manera dinàmica.
  • retorna la instància de Class class.
  • S'ha d'utilitzar si coneixeu el nom complet de la classe. No es pot utilitzar per als tipus primitius.

Vegem un exemple senzill del mètode forName().

Nom de l'arxiu: Test.java

cadena java de la matriu
 class Simple{} public class Test{ public static void main(String args[]) throws Exception { Class c=Class.forName('Simple'); System.out.println(c.getName()); } } 

Sortida:

 Simple 

2) mètode getClass() de la classe Object

Retorna la instància de Class class. S'ha d'utilitzar si coneixeu el tipus. A més, es pot utilitzar amb primitives.

Nom de l'arxiu: Test.java

 class Simple{} class Test{ void printName(Object obj){ Class c=obj.getClass(); System.out.println(c.getName()); } public static void main(String args[]){ Simple s=new Simple(); Test t=new Test(); t.printName(s); } } 

Sortida:

Simple 

3) La sintaxi .class

Si hi ha un tipus disponible, però no hi ha cap instància, llavors és possible obtenir una classe afegint '.class' al nom del tipus. També es pot utilitzar per a tipus de dades primitius.

Nom de l'arxiu: Test.java

arquitectura de Linux
 class Test{ public static void main(String args[]){ Class c = boolean.class; System.out.println(c.getName()); Class c2 = Test.class; System.out.println(c2.getName()); } } 

Sortida:

 boolean Test 

Determinació de l'objecte de classe

Els mètodes següents de Class class s'utilitzen per determinar l'objecte de classe:

1) booleà públic isInterface(): determina si l'objecte Class especificat representa un tipus d'interfície.

2) booleà públic isArray (); determina si aquest objecte Class representa una classe matriu.

3) booleà públic isPrimitive(): determina si l'objecte Class especificat representa un tipus primitiu.

Vegem un exemple senzill d'API de reflexió per determinar el tipus d'objecte.

convertir cadena en enter

Nom de l'arxiu: Test.java

 class Simple{} interface My{} class Test{ public static void main(String args[]){ try{ Class c=Class.forName('Simple'); System.out.println(c.isInterface()); Class c2=Class.forName('My'); System.out.println(c2.isInterface()); }catch(Exception e){System.out.println(e);} } } 

Sortida:

awt java
 false true 

Pros i contres de la reflexió

La reflexió de Java s'ha d'utilitzar sempre amb precaució. Tot i que la reflexió ofereix molts avantatges, també té alguns desavantatges. Parlem primer dels avantatges.

Avantatges: La inspecció d'interfícies, classes, mètodes i camps durant el temps d'execució és possible mitjançant la reflexió, fins i tot sense utilitzar els seus noms durant el temps de compilació. També és possible cridar mètodes, crear una instància clara o establir el valor dels camps mitjançant la reflexió. Ajuda a la creació d'entorns de desenvolupament visual i navegadors de classes que ofereixen ajuda als desenvolupadors per escriure el codi correcte.

Contres: Mitjançant la reflexió, es poden trencar els principis de l'encapsulació. És possible accedir als mètodes i camps privats d'una classe mitjançant la reflexió. Així, la reflexió pot filtrar dades importants al món exterior, cosa que és perillosa. Per exemple, si un accedeix als membres privats d'una classe i li estableix un valor nul, l'altre usuari de la mateixa classe pot obtenir l'excepció NullReferenceException i aquest comportament no s'espera.

Un altre demèrit és la sobrecàrrega en el rendiment. Com que els tipus en reflex es resolen de forma dinàmica, l'optimització de JVM (Java Virtual Machine) no pot tenir lloc. Per tant, les operacions que fan les reflexions solen ser lentes.

Conclusió

A causa dels inconvenients esmentats anteriorment, en general s'aconsella evitar l'ús de la reflexió. És una característica avançada que només han de ser utilitzades per programadors o desenvolupadors que tinguin un bon coneixement dels fonaments bàsics del llenguatge. Sempre recorda! Sempre que s'utilitza la reflexió, la seguretat de l'aplicació es veu compromesa.


Següents temes de l'API de reflexió Tutorial

mètode newInstance().
Comprensió de l'eina javap
Creació d'una eina javap
eina per crear appletviewer
Truqueu al mètode privat des d'una altra classe