Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
һƪÎÄÕ´øÄãѧ¶®Java·´Éä
 
×÷Õߣº¹ùÁØ
  2280  次浏览      27
 2020-10-10
 
±à¼­ÍƼö:
±¾ÎÄÏà¹ØÖªÊ¶µã´ó²¿·Ö×ܽá×Ô Oracle ¹Ù·½Îĵµ£¬Ö÷ÒªÉîÈëdz³öµØ·ÖÏíÁ˶ÔJAVA·´ÉäµÄÀí½â,Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚ΢ÐŹ«Öںţ¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼­¡¢ÍƼö¡£

ǰÑÔ

¶ÔÓÚ Java ·´É䣬ƽ³£¹¤×÷ÖÐËäÈ»¾­³£Óõ½£¬µ«Ò»Ö±ÒÔÀ´¶¼Ã»ÓÐϵͳ×ܽá¹ý£¬ËùÒÔ³Ã×ÅĿǰÓпÕ×ܽáһϣ¬¼ÓÉîÒ»ÏÂÀí½â¡£

Èç¹û·¢ÏÖÃýÎ󣬻¶Ó­¸÷λÅúÆÀÖ¸Õý¡£

±¾ÎÄÏà¹ØÖªÊ¶µã´ó²¿·Ö×ܽá×Ô Oracle ¹Ù·½Îĵµ¡£¶ÔÓÚÓ¢ÎıȽϺõÄÅóÓÑ£¬½¨ÒéÖ±½ÓÔĶÁÔ­Îĵµ¡£

°´Àý£¬Ê×ÏÈÃèÊöһ϶¨Ò壺

Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fields, methods, and constructors to operate on their underlying counterparts, within security restrictions.

ͨ¹ý·´É䣬Java ´úÂë¿ÉÒÔ·¢ÏÖÓйØÒѼÓÔØÀàµÄ×ֶΣ¬·½·¨ºÍ¹¹Ô캯ÊýµÄÐÅÏ¢£¬²¢¿ÉÒÔÔÚ°²È«ÏÞÖÆÄÚ¶ÔÕâЩ×ֶΣ¬·½·¨ºÍ¹¹Ô캯Êý½øÐвÙ×÷¡£

¼ò¶øÑÔÖ®£¬Äã¿ÉÒÔÔÚÔËÐÐ״̬ÖÐͨ¹ý·´Éä»úÖÆ×öµ½£º

1.¶ÔÓÚÈÎÒâÒ»¸öÀ࣬¶¼Äܹ»ÖªµÀÕâ¸öÀàµÄËùÓÐÊôÐԺͷ½·¨£»

2.¶ÔÓÚÈÎÒâÒ»¸ö¶ÔÏ󣬶¼Äܹ»µ÷ÓÃËüµÄÈÎÒâÒ»¸ö·½·¨ºÍÊôÐÔ;

ÕâÖÖ¶¯Ì¬»ñÈ¡µÄÐÅÏ¢ÒÔ¼°¶¯Ì¬µ÷ÓöÔÏóµÄ·½·¨µÄ¹¦ÄܳÆÎªjavaÓïÑԵķ´Éä»úÖÆ¡£

ÔÚÎÒ¿´À´ÎÒÃÇÆ½Ê±Ê¹Óà Java ·´ÉäÖ÷񻃾¼°Á½¸öÀà(½Ó¿Ú) Class£¬ Member£¬Èç¹û°ÑÕâÁ½¸öÀà¸ãÇå³þÁË£¬·´Éä»ù±¾¾Í ok ÁË¡£

ClassÏê½â

Ìáµ½·´Éä¾Í²»µÃ²»Ìáµ½ Class£¬Class ¿ÉÒÔ˵ÊÇ·´ÉäÄܹ»ÊµÏֵĻù´¡£»×¢ÒâÕâÀï˵µÄ ClassÓë class ¹Ø¼ü×Ö²»ÊÇͬһÖÖ¶«Î÷¡£class ¹Ø¼ü×ÖÊÇÔÚÉùÃ÷ java ÀàʱʹÓõģ»¶ø Class ÊÇ java JDK ÌṩµÄÒ»¸öÀà,ÍêÕû·¾¶Îª java.lang.Class£¬±¾ÖÊÉÏÓë Math, String »òÕßÄã×Ô¼º¶¨Òå¸÷ÖÖÀàÃ»Ê²Ã´Çø±ð¡£

public final class Class<T> implements java.io.Serializable, GenericDeclaration, Type, AnnotatedElement {
...
}

ÄÇ Class µ½µ×ÔÚ·´ÉäÖÐÆðµ½Ê²Ã´×÷ÓÃÄØ£¿

For every type of object, the Java virtual machine instantiates an immutable instance of java.lang.Class which provides methods to examine the runtime properties of the object including its members and type information. Class also provides the ability to create new classes and objects . Most importantly, it is the entry point for all of the Reflection APIs.

¶ÔÓÚÿһÖÖÀ࣬Java ÐéÄâ»ú¶¼»á³õʼ»¯³öÒ»¸ö Class ÀàÐ͵ÄʵÀý£¬Ã¿µ±ÎÒÃDZàд²¢ÇÒ±àÒëÒ»¸öд´½¨µÄÀà¾Í»á²úÉúÒ»¸ö¶ÔÓ¦ Class ¶ÔÏ󣬲¢ÇÒÕâ¸ö Class ¶ÔÏó»á±»±£´æÔÚͬÃû .class ÎļþÀï¡£µ±ÎÒÃÇ new Ò»¸öжÔÏó»òÕßÒýÓþ²Ì¬³ÉÔ±±äÁ¿Ê±£¬Java ÐéÄâ»ú(JVM)ÖеÄÀà¼ÓÔØÆ÷ϵͳ»á½«¶ÔÓ¦ Class ¶ÔÏó¼ÓÔØµ½ JVM ÖУ¬È»ºó JVM ÔÙ¸ù¾ÝÕâ¸öÀàÐÍÐÅÏ¢Ïà¹ØµÄClass ¶ÔÏó´´½¨ÎÒÃÇÐèҪʵÀý¶ÔÏó»òÕßÌṩ¾²Ì¬±äÁ¿µÄÒýÓÃÖµ¡£

±ÈÈç´´½¨±àÒëÒ»¸ö Shapes À࣬ÄÇô£¬JVM ¾Í»á´´½¨Ò»¸ö Shapes ¶ÔÓ¦ Class ÀàµÄ ClassʵÀý£¬¸Ã Class ʵÀý±£´æÁË Shapes ÀàÏà¹ØµÄÀàÐÍÐÅÏ¢£¬°üÀ¨ÊôÐÔ£¬·½·¨£¬¹¹Ôì·½·¨µÈµÈ£¬Í¨¹ýÕâ¸ö Class ʵÀý¿ÉÒÔÔÚÔËÐÐʱ·ÃÎÊ Shapes ¶ÔÏóµÄÊôÐԺͷ½·¨µÈ¡£ÁíÍâͨ¹ý ClassÀ໹¿ÉÒÔ´´½¨³öÒ»¸öÐ嵀 Shapes ¶ÔÏó¡£Õâ¾ÍÊÇ·´ÉäÄܹ»ÊµÏÖµÄÔ­Òò£¬¿ÉÒÔ˵ Class ÊÇ·´Éä²Ù×÷µÄ»ù´¡¡£

ÐèÒªÌØ±ð×¢ÒâµÄÊÇ£¬Ã¿¸ö class£¨×¢Òâ class ÊÇСд£¬´ú±íÆÕͨÀࣩÀ࣬ÎÞÂÛ´´½¨¶àÉÙ¸öʵÀý¶ÔÏó£¬ÔÚ JVM Öж¼¶ÔӦͬһ¸ö Class ¶ÔÏó¡£

ÏÂÃæ¾Íͨ¹ýÒ»¸ö¼òµ¥µÄÀý×ÓÀ´ËµÃ÷ÈçºÎͨ¹ý·´ÉäʵÀý»¯Ò»¸ö¶ÔÏó¡£

public class Animal {
private String name;
private int age;
public Animal(String name, int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Animal : name = " + name + " age = " + age;
}
}
public class TestReflection{
private static final String TAG = "Reflection";
public void testReflection(){
//»ñÈ¡AnimalÀàµÄClass¶ÔÏó
Class c = Animal.class;
try {
//ͨ¹ýClass¶ÔÏó·´Éä»ñÈ¡AnimalÀàµÄ¹¹Ôì·½·¨
Constructor constructor = c.getConstructor(String.class, int.class);
//µ÷Óù¹Ôì·½·¨»ñÈ¡AnimalʵÀý
Animal animal = (Animal) constructor.newInstance( "Jack", 3);
//½«¹¹Ôì³öÀ´µÄAnimal¶ÔÏó´òÓ¡³öÀ´
Log.d(TAG, animal.toString());
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}

ÏÂÃæÎÒÃÇÀ´¿´Ï´òÓ¡Öµ

03-28 20:12:00.958 2835-2835/? D/Reflection: Animal : name = Jack age = 3

¿ÉÒÔ¿´³öÎÒÃÇȷʵ³É¹¦¹¹Ôì³öÁË Animal ¶ÔÏ󣬶øÇÒÔÚÕâ¹ý³ÌÖÐ Class ¹¦²»¿Éû¡£ÓÐÈË˵ÄãÕâҲ̫·ÑÊÂÁË£¬¶¼ÖªµÀ Animal ¶ÔÏóÁË£¬ÎÒ·Ö·ÖÖÓ¾ÍÄܸøÄã new ³öÀ´ÁË¡£

Animal animal = new Animal("Jack", 3);

û´í£¡µ«ÊÇÈç¹û²¢²»ÄÜÖ±½Óµ¼Èë Animal ÀàÄØ£¬Èç¹û¹¹Ôì·½·¨¶¼ÊÇ private µÄÄØ£¿Õâ¸öʱºò·´Éä¾ÍÄÜ´óÕ¹ÉíÊÖÁË¡£

ÈçºÎ»ñÈ¡Class

˵ Class ÊÇ·´ÉäÄܹ»ÊµÏֵĻù´¡µÄÁíÒ»¸öÔ­ÒòÊÇ£ºJava ·´Éä°ü java.lang.reflect ÖеÄËùÓÐÀ඼ûÓÐ public ¹¹Ôì·½·¨£¬ÒªÏë»ñµÃÕâЩÀàʵÀý£¬Ö»ÄÜͨ¹ý Class Àà»ñÈ¡¡£ËùÒÔ˵Èç¹ûÏëʹÓ÷´É䣬±ØÐëµÃ»ñµÃ Class ¶ÔÏó¡£

ÏÂÃæÁоÙÁ˼¸ÖÖÄܹ»»ñÈ¡ Class ¶ÔÏóµÄ·½·¨¡£

Object.getClass()

ͨ¹ý¶ÔÏóʵÀý»ñÈ¡¶ÔÓ¦ Class ¶ÔÏó£¬Èç

//Returns the Class for String
Class c = "foo".getClass();

enum E { A, B }
//Returns the Class corresponding to the enumeration type E.
Class c = A.getClass();

byte[] bytes = new byte[1024];
//Returns the Class corresponding to an array with component type byte.
Class c = bytes.getClass();

Set<String> s = new HashSet<String>();
//Returns the Class corresponding to java.util.HashSet.
Class c = s.getClass();

È»¶ø¶ÔÓÚ»ù±¾ÀàÐÍÎÞ·¨Ê¹ÓÃÕâÖÖ·½·¨

boolean b;
Class c = b.getClass(); // compile-time error

The .class Syntax

ͨ¹ýÀàµÄÀàÐÍ»ñÈ¡Class¶ÔÏó,»ù±¾ÀàÐÍͬÑù¿ÉÒÔʹÓÃÕâÖÖ·½·¨£¬Èç

//The `.class` syntax returns the Class corresponding to the type `boolean`.
Class c = boolean.class;

//Returns the Class for String
Class c = String.class;

ͨ¹ýÀàµÄÈ«ÏÞ¶¨Ãû»ñÈ¡Class¶ÔÏó£¬ »ù±¾ÀàÐÍÎÞ·¨Ê¹Óô˷½·¨

Class c = Class.forName("java.lang.String");

¶ÔÓÚÊý×é±È½ÏÌØÊâ

Class cDoubleArray = Class.forName("[D"); //Ï൱ÓÚdouble[].class
Class cStringArray = Class.forName("[[Ljava.lang.String;"); //Ï൱ÓÚString[][].class

»ù±¾ÀàÐÍºÍ void ÀàÐ͵İü×°Àà¿ÉÒÔʹÓà TYPE ×ֶλñÈ¡

Class c = Double.TYPE; //µÈ¼ÛÓÚ double.class.
Class c = Void.TYPE;

Methods that Return Classes

ÁíÍ⻹ÓÐһЩ·´Éä·½·¨¿ÉÒÔ»ñÈ¡ Class ¶ÔÏ󣬵«Ç°ÌáÊÇÄãÒѾ­»ñÈ¡ÁËÒ»¸ö Class ¶ÔÏó¡£

ÓеãÞÖ¿Ú£¬±ÈÈç˵ÄãÒѾ­»ñÈ¡ÁËÒ»¸öÀàµÄ Class ¶ÔÏ󣬾ͿÉÒÔͨ¹ý·´Éä·½·¨»ñÈ¡Õâ¸öÀàµÄ¸¸ÀàµÄ Class ¶ÔÏó¡£

Class.getSuperclass()»ñµÃ¸ø¶¨ÀàµÄ¸¸Àà Class

// javax.swing.JButtonµÄ¸¸ÀàÊÇjavax.swing.AbstractButton
Class c = javax.swing.JButton.class.getSuperclass();

ÀàËÆ·½·¨»¹ÓУº

Class.getClasses()
Class.getDeclaredClasses()
Class.getDeclaringClass()
Class.getEnclosingClass()
java.lang.reflect.Field.getDeclaringClass()
java.lang.reflect.Method.getDeclaringClass()
java.lang.reflect.Constructor.getDeclaringClass()

ͨ¹ýClass»ñÈ¡ÀàÐÞÊηûºÍÀàÐÍ

ÎÒÃÇÖªµÀÀàµÄÉùÃ÷Ò»°ãÈçÏÂ

ÏÂÃæÎÒÃǾÍÒÔ HashMap ΪÀý£¬Í¨¹ýÒ»¸ö Demo À´ËµÃ÷ÈçºÎ»ñÈ¡ÕâЩÐÅÏ¢

public class TestReflection {
private static final String TAG = "Reflection";
public void testReflection() {
Class<?> c = HashMap.class;
//»ñÈ¡ÀàÃû
Log.d(TAG, "Class : " + c.getCanonicalName());
//»ñÈ¡ÀàÏÞ¶¨·û
Log.d(TAG, "Modifiers : " + Modifier.toString(c.getModifiers()));
//»ñÈ¡Àà·ºÐÍÐÅÏ¢
TypeVariable[] tv = c.getTypeParameters();
if (tv.length != 0) {
StringBuilder parameter = new StringBuilder("Parameters : ");
for (TypeVariable t : tv) {
parameter.append(t.getName());
parameter.append(" ");
}
Log.d(TAG, parameter.toString());
} else {
Log.d(TAG, " -- No Type Parameters --");
}
//»ñÈ¡ÀàʵÏÖµÄËùÓнӿÚ
Type[] intfs = c.getGenericInterfaces();
if (intfs.length != 0) {
StringBuilder interfaces = new StringBuilder("Implemented Interfaces : ");
for (Type intf : intfs){
interfaces.append(intf.toString());
interfaces.append(" ");
}
Log.d(TAG, interfaces.toString());
} else {
Log.d(TAG, " -- No Implemented Interfaces --");
}
//»ñÈ¡Àà¼Ì³ÐÊýÉϵÄËùÓи¸Àà
List<Class> l = new ArrayList<>();
printAncestor(c, l);
if (l.size() != 0) {
StringBuilder inheritance = new StringBuilder("Inheritance Path : ");
for (Class<?> cl : l){
inheritance.append(cl.getCanonicalName());
inheritance.append(" ");
}
Log.d(TAG, inheritance.toString());
} else {
Log.d(TAG, " -- No Super Classes --%n%n");
}
//»ñÈ¡ÀàµÄ×¢½â(Ö»ÄÜ»ñÈ¡µ½ RUNTIME ÀàÐ͵Ä×¢½â)
Annotation[] ann = c.getAnnotations();
if (ann.length != 0) {
StringBuilder annotation = new StringBuilder("Annotations : ");
for (Annotation a : ann){
annotation.append(a.toString());
annotation.append(" ");
}
Log.d(TAG, annotation.toString());
} else {
Log.d(TAG, " -- No Annotations --%n%n");
}
}
private static void printAncestor(Class<?> c, List<Class> l) {
Class<?> ancestor = c.getSuperclass();
if (ancestor != null) {
l.add(ancestor);
printAncestor(ancestor, l);
}
}
}

´òÓ¡½á¹ûÈçÏÂ

03-29 15:04:23.070 27826-27826/com.example.ming.testproject D/Reflection: Class : java.util.HashMap
03-29 15:04:23.070 27826-27826/com.example.ming.testproject D/Reflection: Modifiers : public
03-29 15:04:23.071 27826-27826/com.example.ming.testproject D/Reflection: Parameters : K V
03-29 15:04:23.071 27826-27826/com.example.ming.testproject D/Reflection: Implemented Interfaces : java.util.Map<K, V>
interface java.lang.Cloneable interface java.io.Serializable
03-29 15:04:23.071 27826-27826/com.example.ming.testproject D/Reflection: Inheritance Path : java.util.AbstractMap java.lang.Object
03-29 15:04:23.071 27826-27826/com.example.ming.testproject D/Reflection: -- No Annotations --

Member

Reflection defines an interface java.lang.reflect.Member which is implemented by java.lang . reflect . Field, java.lang.reflect.Method, and java.lang.reflect.Constructor .

¶ÔÓÚ Member ½Ó¿Ú¿ÉÄÜ»áÓÐÈ˲»Çå³þÊǸÉʲôµÄ£¬µ«Èç¹ûÌᵽʵÏÖËüµÄÈý¸öʵÏÖÀ࣬¹À¼ÆÓùý·´ÉäµÄÈ˶¼ÄÜÖªµÀ¡£ÎÒÃÇÖªµÀÀà³ÉÔ±Ö÷Òª°üÀ¨¹¹Ô캯Êý£¬±äÁ¿ºÍ·½·¨£¬Java ÖеIJÙ×÷»ù±¾¶¼ºÍÕâÈýÕßÏà¹Ø£¬¶ø Member µÄÕâÈý¸öʵÏÖÀà¾Í·Ö±ð¶ÔÓ¦ËûÃÇ¡£

java.lang.reflect.Field £º¶ÔÓ¦Àà±äÁ¿

java.lang.reflect.Method £º¶ÔÓ¦Àà·½·¨

java.lang.reflect.Constructor £º¶ÔÓ¦À๹Ô캯Êý

·´Éä¾ÍÊÇͨ¹ýÕâÈý¸öÀà²ÅÄÜÔÚÔËÐÐʱ¸Ä±ä¶ÔÏó״̬¡£ÏÂÃæ¾ÍÈÃÎÒÃÇͨ¹ýһЩÀý×ÓÀ´ËµÃ÷ÈçºÎͨ¹ý·´Éä²Ù×÷ËüÃÇ¡£

Ê×ÏȽ¨Ò»¸ö²âÊÔÀà

public class Cat {
public static final String TAG = Cat.class.getSimpleName();
private String name;
@Deprecated
public int age;
public Cat(String name, int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public void eat(String food){
Log.d(TAG, "eat food " + food);
}
public void eat(String... foods){
StringBuilder s = new StringBuilder();
for(String food : foods){
s.append(food);
s.append(" ");
}
Log.d(TAG, "eat food " + s.toString());
}
public void sleep(){
Log.d(TAG, "sleep");
}
@Override
public String toString() {
return "name = " + name + " age = " + age;
}
}

Field

ͨ¹ý Field Äã¿ÉÒÔ·ÃÎʸø¶¨¶ÔÏóµÄÀà±äÁ¿£¬°üÀ¨»ñÈ¡±äÁ¿µÄÀàÐÍ¡¢ÐÞÊηû¡¢×¢½â¡¢±äÁ¿Ãû¡¢±äÁ¿µÄÖµ»òÕßÖØÐÂÉèÖñäÁ¿Öµ£¬¼´Ê¹±äÁ¿ÊÇ private µÄ¡£

1.»ñÈ¡ Field

Class ÌṩÁË4ÖÖ·½·¨»ñµÃ¸ø¶¨ÀàµÄ Field

getDeclaredField(String name)

»ñȡָ¶¨µÄ±äÁ¿£¨Ö»ÒªÊÇÉùÃ÷µÄ±äÁ¿¶¼ÄÜ»ñµÃ£¬°üÀ¨ private£©

getField(String name)

»ñȡָ¶¨µÄ±äÁ¿£¨Ö»ÄÜ»ñµÃ public µÄ£©

getDeclaredFields()

»ñÈ¡ËùÓÐÉùÃ÷µÄ±äÁ¿£¨°üÀ¨ private£©

getFields()

»ñÈ¡ËùÓÐµÄ public ±äÁ¿

2.»ñÈ¡±äÁ¿ÀàÐÍ¡¢ÐÞÊηû¡¢×¢½â

Ò»¸öÀý×Ó˵Ã÷ÎÊÌâ

public void testField(){
Class c = Cat.class;
Field[] fields = c.getDeclaredFields();
for(Field f : fields){
StringBuilder builder = new StringBuilder();
//»ñÈ¡Ãû³Æ
builder.append("filed name = ");
builder.append(f.getName());
//»ñÈ¡ÀàÐÍ
builder.append(" type = ");
builder.append(f.getType());
//»ñÈ¡ÐÞÊηû
builder.append(" modifiers = ");
builder.append(Modifier.toString(f.getModifiers()));
//»ñȡע½â
Annotation[] ann = f.getAnnotations();
if (ann.length != 0) {
builder.append(" annotations = ");
for (Annotation a : ann){
builder.append(a.toString());
builder.append(" ");
}
} else {
builder.append(" -- No Annotations --");
}
Log.d(TAG, builder.toString());
}
}

´òÓ¡½á¹û£º

filed name = age type = int modifiers = public annotations = @java.lang.Deprecated()
filed name = name type = class java.lang.String modifiers = private -- No Annotations --
filed name = TAG type = class java.lang.String modifiers = public static final -- No Annotations --

3.»ñÈ¡¡¢ÉèÖñäÁ¿Öµ

¸ø¶¨Ò»¸ö¶ÔÏóºÍËüµÄ³ÉÔ±±äÁ¿Ãû³Æ£¬¾ÍÄÜͨ¹ý·´Éä»ñÈ¡ºÍ¸Ä±ä¸Ã±äÁ¿µÄÖµ¡£Ê²Ã´¶¼²»ËµÁË£¬Ã»ÓÐʲôÊDz»ÄÜͨ¹ýÒ»¸öÀý×Ó½â¾öµÄ£¬ Easy~

ÈÔÈ»ÊÇÉÏÃæµÄ²âÊÔÀ࣬ͨ¹ý·´Éä»ñÈ¡²¢¸Ä±ä Cat µÄ name ºÍ age.

public void testField(){
Cat cat = new Cat("Tom", 2);
Class c = cat.getClass();
try {
//×¢Òâ»ñÈ¡private±äÁ¿Ê±£¬ÐèÒªÓÃgetDeclaredField
Field fieldName = c.getDeclaredField("name");
Field fieldAge = c.getField("age");
//·´Éä»ñÈ¡Ãû×Ö, ÄêÁä
String name = (String) fieldName.get(cat);
int age = fieldAge.getInt(cat);
Log.d(TAG, "before set, Cat name = " + name + " age = " + age);
//·´ÉäÖØÐÂsetÃû×ÖºÍÄêÁä
fieldName.set(cat, "Timmy");
fieldAge.setInt(cat, 3);
Log.d(TAG, "after set, Cat " + cat.toString());
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}

àÅ£¿¾¹È»±¨´í£¿

System.err: java.lang.IllegalAccessException: Class java.lang.Class<com.example.ming.testnestscrollview.
TestReflection>
cannot access private field java.lang.String com.example.ming.testnestscrollview.Cat.name
of class java.lang.Class<com.example.ming.
testnestscrollview.Cat>
System.err: at java.lang.reflect.Field.get(Native Method)
System.err: at com.example.ming.testnestscrollview.
TestReflection.testField
(TestReflection.java:22)
System.err: at com.example.ming.
testnestscrollview.MainActivity.onCreate
(MainActivity.java:17)

¹Û²ìÒ»ÏÂÒì³£ÐÅÏ¢ java.lang.IllegalAccessException£¬ËµÎÒÃÇûÓÐȨÏÞ²Ù×÷±äÁ¿ name£»»Øµ½ Cat ÀàÖв鿴һÏ name ±äÁ¿¡£

private String name;

Ô­À´ name ±äÁ¿ÊÇ private£¬Java ÔËÐÐʱ»á½øÐзÃÎÊȨÏÞ¼ì²é£¬private ÀàÐ͵ıäÁ¿ÎÞ·¨½øÐÐÖ±½Ó·ÃÎÊ£¬¸Õ¸Õ½øÐеķ´Éä²Ù×÷²¢Ã»ÓдòÆÆÕâÖÖ·â×°£¬ËùÒÔÎÒÃÇÒÀȻûÓÐȨÏÞ¶Ô privateÊôÐÔ½øÐÐÖ±½Ó·ÃÎÊ¡£

ÄѵÀ¾ÍûÓа취´òÆÆÕâÖÖÏÞÖÆÂ𣿱ØÐëÓУ¡Ç¿´óµÄ·´ÉäÔçÒѰµÖÐΪÎÒÃÇ×¼±¸ºÃÁËÒ»ÇС£·´Éä°üÀïΪÎÒÃÇÌṩÁËÒ»¸öÇ¿´óµÄÀà¡£

java.lang.reflect.AccessibleObject

AccessibleObject ΪÎÒÃÇÌṩÁËÒ»¸ö·½·¨ setAccessible(boolean flag)£¬¸Ã·½·¨µÄ×÷ÓþÍÊÇ¿ÉÒÔÈ¡Ïû Java ÓïÑÔ·ÃÎÊȨÏÞ¼ì²é¡£ËùÒÔÈκμ̳РAccessibleObject µÄÀàµÄ¶ÔÏ󶼿ÉÒÔʹÓø÷½·¨È¡Ïû Java ÓïÑÔ·ÃÎÊȨÏÞ¼ì²é¡££¨final ÀàÐͱäÁ¿Ò²¿ÉÒÔͨ¹ýÕâÖÖ°ì·¨·ÃÎÊ£©

public final class Field extends AccessibleObject implements Member

Field ÕýÊÇ AccessibleObject µÄ×ÓÀ࣬ÄÇô¼òµ¥ÁË£¬Ö»ÒªÔÚ·ÃÎÊ˽ÓбäÁ¿Ç°µ÷Óà filed .setAccessible (true) ¾Í¿ÉÒÔÁË

...
fieldName.setAccessible(true);
//·´Éä»ñÈ¡Ãû×Ö, ÄêÁä
String name = (String) fieldName.get(cat);
...

´òÓ¡½á¹û

TestReflection: before set, Cat name = Tom age = 2
TestReflection: after set, Cat name = Timmy age = 3

×¢Òâ Method ºÍ Constructor Ò²¶¼ÊǼ̳РAccessibleObject£¬ËùÒÔÈç¹ûÓöµ½Ë½Óз½·¨ºÍ˽Óй¹Ô캯ÊýÎÞ·¨·ÃÎÊ£¬¼ÇµÃ´¦Àí·½·¨Ò»Ñù¡£

Method

The java.lang.reflect.Method class provides APIs to access information about a method's modifiers , return type, parameters, annotations, and thrown exceptions. It also be used to invoke methods .

Õâ½ÚÖ÷Òª½éÉÜÈçºÎͨ¹ý·´Éä·ÃÎʶÔÏóµÄ·½·¨¡£

1.»ñÈ¡ Method

Class ÒÀÈ»ÌṩÁË4ÖÖ·½·¨»ñÈ¡ Method:

getDeclaredMethod(String name, Class<?>... parameterTypes)

¸ù¾Ý·½·¨Ãû»ñµÃÖ¸¶¨µÄ·½·¨£¬ ²ÎÊý name Ϊ·½·¨Ãû£¬²ÎÊý parameterTypes Ϊ·½·¨µÄ²ÎÊýÀàÐÍ£¬Èç getDeclaredMethod(¡°eat¡±, String.class)

getMethod(String name, Class<?>... parameterTypes)

¸ù¾Ý·½·¨Ãû»ñȡָ¶¨µÄ public ·½·¨£¬ÆäËüͬÉÏ

getDeclaredMethods()

»ñÈ¡ËùÓÐÉùÃ÷µÄ·½·¨

getMethods()

»ñÈ¡ËùÓÐµÄ public ·½·¨

×¢Ò⣺»ñÈ¡´ø²ÎÊý·½·¨Ê±£¬Èç¹û²ÎÊýÀàÐÍ´íÎó»á±¨ NoSuchMethodException£¬¶ÔÓÚ²ÎÊýÊÇ·ºÐ͵ÄÇé¿ö£¬·ºÐÍÐëµ±³ÉObject´¦Àí£¨Object.class£©

2.»ñÈ¡·½·¨·µ»ØÀàÐÍ

getReturnType() »ñȡĿ±ê·½·¨·µ»ØÀàÐͶÔÓ¦µÄ Class ¶ÔÏó

getGenericReturnType() »ñȡĿ±ê·½·¨·µ»ØÀàÐͶÔÓ¦µÄ Type ¶ÔÏó

ÕâÁ½¸ö·½·¨ÓÐÉ¶Çø±ðÄØ£¿

getReturnType()·µ»ØÀàÐÍΪ Class£¬getGenericReturnType() ·µ»ØÀàÐÍΪ Type; Class ʵÏÖ Type¡£

·µ»ØÖµÎªÆÕͨ¼òµ¥ÀàÐÍÈç Object, int, String µÈ£¬getGenericReturnType() ·µ»ØÖµºÍ getReturnType() Ò»Ñù

ÀýÈç public String function1()£¬ÄÇô¸÷×Ô·µ»ØÖµÎª£º

getReturnType() : class java.lang.String

getGenericReturnType() : class java.lang.String

·µ»ØÖµÎª·ºÐÍ

ÀýÈç public T function2()£¬ÄÇô¸÷×Ô·µ»ØÖµÎª£º

getReturnType() : class java.lang.Object

getGenericReturnType() : T

·µ»ØÖµÎª²ÎÊý»¯ÀàÐÍ

ÀýÈçpublic Class<String> function3()£¬ÄÇô¸÷×Ô·µ»ØÖµÎª£º

getReturnType() : class java.lang.Class

getGenericReturnType() : java.lang.Class<java.lang.String>

Æäʵ·´ÉäÖÐËùÓÐÐÎÈç getGenericXXX()µÄ·½·¨¹æÔò¶¼ÓëÉÏÃæËùÊöÀàËÆ¡£

»ñÈ¡·½·¨²ÎÊýÀàÐÍ

getParameterTypes() »ñȡĿ±ê·½·¨¸÷²ÎÊýÀàÐͶÔÓ¦µÄ Class ¶ÔÏó

getGenericParameterTypes() »ñȡĿ±ê·½·¨¸÷²ÎÊýÀàÐͶÔÓ¦µÄ Type ¶ÔÏó

·µ»ØÖµÎªÊý×飬ËüÁ©Çø±ðͬÉÏ ¡°·½·¨·µ»ØÀàÐ͵ÄÇø±ð¡± ¡£

»ñÈ¡·½·¨ÉùÃ÷Å׳öµÄÒì³£µÄÀàÐÍ

getExceptionTypes() »ñȡĿ±ê·½·¨Å׳öµÄÒì³£ÀàÐͶÔÓ¦µÄ Class ¶ÔÏó

getGenericExceptionTypes() »ñȡĿ±ê·½·¨Å׳öµÄÒì³£ÀàÐͶÔÓ¦µÄ Type ¶ÔÏó

·µ»ØÖµÎªÊý×é£¬Çø±ðͬÉÏ

»ñÈ¡·½·¨²ÎÊýÃû³Æ

.class ÎļþÖÐĬÈϲ»´æ´¢·½·¨²ÎÊýÃû³Æ£¬Èç¹ûÏëÒª»ñÈ¡·½·¨²ÎÊýÃû³Æ£¬ÐèÒªÔÚ±àÒëµÄʱºò¼ÓÉÏ -parameters ²ÎÊý¡£(¹¹Ôì·½·¨µÄ²ÎÊý»ñÈ¡·½·¨Í¬Ñù)

//ÕâÀïµÄm¿ÉÒÔÊÇÆÕͨ·½·¨Method£¬Ò²¿ÉÒÔÊǹ¹Ôì·½·¨Constructor
//»ñÈ¡·½·¨ËùÓвÎÊý
Parameter[] params = m.getParameters();
for (int i = 0; i < params.length; i++) {
Parameter p = params[i];
p.getType(); //»ñÈ¡²ÎÊýÀàÐÍ
p.getName(); //»ñÈ¡²ÎÊýÃû³Æ£¬Èç¹û±àÒëʱδ¼ÓÉÏ`-parameters`£¬
·µ»ØµÄÃû³ÆÐÎÈç`argX`, XΪ²ÎÊýÔÚ·½·¨ÉùÃ÷ÖеÄλÖ㬴Ó0¿ªÊ¼
p.getModifiers(); //»ñÈ¡²ÎÊýÐÞÊηû
p.isNamePresent(); //.classÎļþÖÐÊÇ·ñ±£´æ²ÎÊýÃû³Æ, ±àÒëʱ¼ÓÉÏ`-parameters`·µ»Øtrue,·´Ö®flase
}

»ñÈ¡·½·¨²ÎÊýÃû³ÆµÄÏêϸÐÅÏ¢Çë²Î¿¼ oracle µÄ¹Ù·½Àý×Ó MethodParameterSpy

»ñÈ¡·½·¨ÐÞÊηû

·½·¨Óë Filed µÈÀàËÆ

method.getModifiers();

Ps£ºË³±ã¶à½éÉܼ¸¸öMethod·½·¨

method.isVarArgs() //ÅжϷ½·¨²ÎÊýÊÇ·ñÊǿɱä²ÎÊý

method.isSynthetic() //ÅжÏÊÇ·ñÊǸ´ºÏ·½·¨£¬¸öÈËÀí½â¸´ºÏ·½·¨ÊDZàÒëÆÚ¼ä±àÒëÆ÷Éú³ÉµÄ·½·¨£¬²¢²»ÊÇÔ´´úÂëÖÐÓеķ½·¨

method.isBridge() //ÅжÏÊÇ·ñÊÇÇŽӷ½·¨£¬ÇŽӷ½·¨ÊÇ JDK 1.5 ÒýÈë·ºÐͺó£¬ÎªÁËʹJavaµÄ·ºÐÍ·½·¨Éú³ÉµÄ×Ö½ÚÂëºÍ 1.5 °æ±¾Ç°µÄ×Ö½ÚÂëÏà¼æÈÝ£¬ÓɱàÒëÆ÷×Ô¶¯Éú³ÉµÄ·½·¨¡£

ͨ¹ý·´Éäµ÷Ó÷½·¨

·´Éäͨ¹ýMethodµÄinvoke()·½·¨À´µ÷ÓÃÄ¿±ê·½·¨¡£µÚÒ»¸ö²ÎÊýΪÐèÒªµ÷ÓõÄÄ¿±êÀà¶ÔÏó£¬Èç¹û·½·¨ÎªstaticµÄ£¬Ôò¸Ã²ÎÊýΪnull¡£ºóÃæµÄ²ÎÊý¶¼ÎªÄ¿±ê·½·¨µÄ²ÎÊýÖµ£¬Ë³ÐòÓëÄ¿±ê·½·¨ÉùÃ÷ÖеIJÎÊý˳ÐòÒ»Ö¡£

public native Object invoke(Object obj, Object... args)
throws IllegalAccessException, IllegalArgumentException, InvocationTargetException

»¹ÊÇÒÔÉÏÃæ²âÊÔÀà Cat ΪÀý

×¢Ò⣺Èç¹û·½·¨ÊÇprivateµÄ£¬¿ÉÒÔʹÓà method.setAccessible(true) ·½·¨ÈƹýȨÏÞ¼ì²é

Class<?> c = Cat.class;
try {
//¹¹ÔìCatʵÀý
Constructor constructor = c.getConstructor(String.class,
int.class);
Object cat = constructor.newInstance( "Jack", 3);
//µ÷ÓÃÎ޲η½·¨
Method sleep = c.getDeclaredMethod("sleep");
sleep.invoke(cat);
//µ÷Óö¨Ïî²ÎÊý·½·¨
Method eat = c.getDeclaredMethod("eat", String.class);
eat.invoke(cat, "grass");
//µ÷Óò»¶¨Ïî²ÎÊý·½·¨
//²»¶¨Ïî²ÎÊý¿ÉÒÔµ±³ÉÊý×éÀ´´¦Àí
Class[] argTypes = new Class[] { String[].class };
Method varargsEat = c.getDeclaredMethod("eat", argTypes);
String[] foods = new String[]{
"grass", "meat"
};
varargsEat.invoke(cat, (Object)foods);
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
e.printStackTrace();
}

±»µ÷Óõķ½·¨±¾ÉíËùÅ׳öµÄÒì³£ÔÚ·´ÉäÖж¼»áÒÔ InvocationTargetException Å׳ö¡£»»¾ä»°Ëµ£¬·´Éäµ÷Óùý³ÌÖÐÈç¹ûÒì³£ InvocationTargetException Å׳ö£¬ËµÃ÷·´Éäµ÷Óñ¾ÉíÊdzɹ¦µÄ£¬ÒòΪÕâ¸öÒì³£ÊÇÄ¿±ê·½·¨±¾ÉíËùÅ׳öµÄÒì³£¡£

Constructor

Õâ½ÚÖ÷Òª½éÉÜÈçºÎͨ¹ý·´Éä·ÃÎʹ¹Ôì·½·¨²¢Í¨¹ý¹¹Ôì·½·¨¹¹½¨ÐµĶÔÏó¡£

»ñÈ¡¹¹Ôì·½·¨

ºÍ Method Ò»Ñù£¬Class ҲΪ Constructor ÌṩÁË4ÖÖ·½·¨»ñÈ¡

getDeclaredConstructor(Class<?>... parameterTypes)

»ñȡָ¶¨¹¹Ô캯Êý£¬²ÎÊý parameterTypes Ϊ¹¹Ôì·½·¨µÄ²ÎÊýÀàÐÍ

getConstructor(Class<?>... parameterTypes)

»ñȡָ¶¨ public ¹¹Ô캯Êý£¬²ÎÊý parameterTypes Ϊ¹¹Ôì·½·¨µÄ²ÎÊýÀàÐÍ

getDeclaredConstructors()

»ñÈ¡ËùÓÐÉùÃ÷µÄ¹¹Ôì·½·¨

getConstructors()

»ñÈ¡ËùÓÐµÄ public ¹¹Ôì·½·¨

¹¹Ôì·½·¨µÄÃû³Æ¡¢ÏÞ¶¨·û¡¢²ÎÊý¡¢ÉùÃ÷µÄÒì³£µÈ»ñÈ¡·½·¨¶¼Óë Method ÀàËÆ£¬Çë²ÎÕÕMethod¡£

´´½¨¶ÔÏó

ͨ¹ý·´ÉäÓÐÁ½ÖÖ·½·¨¿ÉÒÔ´´½¨¶ÔÏó£º

java.lang.reflect.Constructor.newInstance()

Class.newInstance()

Ò»°ãÀ´½²£¬ÎÒÃÇÓÅÏÈʹÓõÚÒ»ÖÖ·½·¨£»ÄÇôÕâÁ½ÖÖ·½·¨ÓкÎÒìÍ¬ÄØ£¿

Class.newInstance()½ö¿ÉÓÃÀ´µ÷ÓÃÎ޲εĹ¹Ôì·½·¨£»Constructor.newInstance()¿ÉÒÔµ÷ÓÃÈÎÒâ²ÎÊýµÄ¹¹Ôì·½·¨¡£

Class.newInstance()»á½«¹¹Ôì·½·¨ÖÐÅ׳öµÄÒì³£²»×÷´¦ÀíÔ­ÑùÅ׳ö; Constructor.newInstance() »á½«¹¹Ôì·½·¨ÖÐÅ׳öµÄÒì³£¶¼°ü×°³É InvocationTargetException Å׳ö¡£

Class.newInstance()ÐèÒªÓµÓй¹Ôì·½·¨µÄ·ÃÎÊȨÏÞ; Constructor.newInstance()¿ÉÒÔͨ¹ý setAccessible(true) ·½·¨Èƹý·ÃÎÊȨÏÞ·ÃÎÊ private ¹¹Ôì·½·¨¡£

Àý×ÓÔÚ Method Ò»½ÚÒѾ­Ð´¹ý£¬ÕâÀïÖ±½Ó½ØÈ¡¹ýÀ´

Class<?> c = Cat.class;
try {
Constructor constructor = c.getConstructor(String.class, int.class);
Cat cat = (Cat) constructor.newInstance( "Jack", 3);
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
e.printStackTrace();
}

×¢Ò⣺·´Éä²»Ö§³Ö×Ô¶¯·âÏ䣬´«Èë²ÎÊýʱҪСÐÄ£¨×Ô¶¯·âÏäÊÇÔÚ±àÒëÆÚ¼äµÄ£¬¶ø·´ÉäÔÚÔËÐÐÆÚ¼ä£©

Êý×éºÍö¾Ù

Êý×éºÍö¾ÙÒ²ÊǶÔÏ󣬵«ÊÇÔÚ·´ÉäÖУ¬¶ÔÊý×éºÍö¾ÙµÄ´´½¨¡¢·ÃÎÊºÍÆÕͨ¶ÔÏóÓÐÄÇôһ¶ª¶ªµÄ²»Í¬£¬ËùÒÔ Java ·´ÉäΪÊý×éºÍö¾ÙÌṩÁËÒ»Ð©ÌØ¶¨µÄ API ½Ó¿Ú¡£

Êý×é

Êý×éÀàÐÍ

Êý×éÀàÐÍ£ºÊý×é±¾ÖÊÊÇÒ»¸ö¶ÔÏó£¬ËùÒÔËüÒ²ÓÐ×Ô¼ºµÄÀàÐÍ¡£

ÀýÈç¶ÔÓÚint[] intArray£¬Êý×éÀàÐÍΪclass [I¡£Êý×éÀàÐÍÖеÄ[¸öÊý´ú±íÊý×éµÄά¶È£¬ÀýÈç[´ú±íһάÊý×飬[[ ´ú±í¶þάÊý×飻[ ºóÃæµÄ×Öĸ´ú±íÊý×éÔªËØÀàÐÍ£¬I ´ú±í int£¬Ò»°ãΪÀàÐ͵ÄÊ××Öĸ´óд(long ÀàÐÍÀýÍ⣬Ϊ J)¡£

class [B //byteÀàÐÍһάÊý×é

class [S //shortÀàÐÍһάÊý×é

class [I //intÀàÐÍһάÊý×é

class [C //charÀàÐÍһάÊý×é

class [J //longÀàÐÍһάÊý×飬J´ú±ílongÀàÐÍ£¬ÒòΪL±»ÒýÓöÔÏóÀàÐÍÕ¼ÓÃÁË

class [F //floatÀàÐÍһάÊý×é

class [D //doubleÀàÐÍһάÊý×é

class [Lcom.dada.Season //ÒýÓÃÀàÐÍһάÊý×é

class [[Ljava.lang.String //ÒýÓÃÀàÐͶþάÊý×é

//»ñȡһ¸ö±äÁ¿µÄÀàÐÍ
Class<?> c = field.getType();
//ÅжϸñäÁ¿ÊÇ·ñΪÊý×é
if (c.isArray()) {
//»ñÈ¡Êý×éµÄÔªËØÀàÐÍ
c.getComponentType()
}

´´½¨ºÍ³õʼ»¯Êý×é

Java ·´ÉäΪÎÒÃÇÌṩÁË java.lang.reflect.Array ÀàÓÃÀ´´´½¨ºÍ³õʼ»¯Êý×é¡£

//´´½¨Êý×飬 ²ÎÊýcomponentTypeΪÊý×éÔªËØµÄÀàÐÍ£¬ºóÃæ²»¶¨Ïî²ÎÊýµÄ¸öÊý´ú±íÊý×éµÄά¶È£¬²ÎÊýֵΪÊý×鳤¶È
Array.newInstance(Class<?> componentType, int... dimensions)

//ÉèÖÃÊý×éÖµ£¬arrayΪÊý×é¶ÔÏó£¬indexΪÊý×éµÄϱ꣬valueΪÐèÒªÉèÖõÄÖµ
Array.set(Object array, int index, int value)

//»ñÈ¡Êý×éµÄÖµ£¬arrayΪÊý×é¶ÔÏó£¬indexΪÊý×éµÄϱê
Array.get(Object array, int index)

Àý×Ó,Ó÷´Éä´´½¨ int[] array = new int[]{1, 2}

Object array = Array.newInstance(int.class, 2);
Array.setInt(array , 0, 1);
Array.setInt(array , 1, 2);

×¢Ò⣺·´ÉäÖ§³Ö¶ÔÊý¾Ý×Ô¶¯¼Ó¿í£¬µ«²»ÔÊÐíÊý¾Ý narrowing(±äÕ­?ÕæÄÑ·­Òë)¡£Òâ˼ÊǶÔÓÚÉÏÊö set ·½·¨£¬Äã¿ÉÒÔÔÚ int ÀàÐÍÊý×éÖÐ set short ÀàÐÍÊý¾Ý£¬µ«²»¿ÉÒÔ set long ÀàÐÍÊý¾Ý£¬·ñÔò»á±¨ IllegalArgumentException¡£

¶àάÊý×é

Java ·´ÉäûÓÐÌṩÄܹ»Ö±½Ó·ÃÎʶàάÊý×éÔªËØµÄ API£¬µ«Äã¿ÉÒ԰ѶàάÊý×éµ±³ÉÊý×éµÄÊý×é´¦Àí¡£

Object matrix = Array.newInstance(int.class, 2, 2);
Object row0 = Array.get(matrix, 0);
Object row1 = Array.get(matrix, 1);

Array.setInt(row0, 0, 1);
Array.setInt(row0, 1, 2);
Array.setInt(row1, 0, 3);
Array.setInt(row1, 1, 4);

»òÕß

Object matrix = Array.newInstance(int.class, 2);
Object row0 = Array.newInstance(int.class, 2);
Object row1 = Array.newInstance(int.class, 2);

Array.setInt(row0, 0, 1);
Array.setInt(row0, 1, 2);
Array.setInt(row1, 0, 3);
Array.setInt(row1, 1, 4);



Array.set(matrix, 0, row0);
Array.set(matrix, 1, row1);

ö¾Ù

ö¾ÙÒþʽ¼Ì³Ð×Ô java.lang.Enum£¬Enum ¼Ì³Ð×Ô Object£¬ËùÒÔö¾Ù±¾ÖÊÒ²ÊÇÒ»¸öÀ࣬Ҳ¿ÉÒÔÓгÉÔ±±äÁ¿£¬¹¹Ôì·½·¨£¬·½·¨µÈ£»¶ÔÓÚÆÕͨÀàËùÄÜʹÓõķ´Éä·½·¨£¬Ã¶¾Ù¶¼ÄÜʹÓã»ÁíÍâ java ·´Éä¶îÍâÌṩÁ˼¸¸ö·½·¨ÎªÃ¶¾Ù·þÎñ¡£

1.Class.isEnum()

Indicates whether this class represents an enum type

2.Class.getEnumConstants()

Retrieves the list of enum constants defined by the enum in the order they're declared

3.java.lang.reflect.Field.isEnumConstant()

Indicates whether this field represents an element of an enumerated type

×ܽá

ûÓÐÈκÎÒ»Ïî¼¼ÊõÊÇʮȫʮÃÀµÄ£¬Java ·´ÉäÓµÓÐÇ¿´ó¹¦ÄܵÄͬʱҲ´øÀ´ÁËһЩ¸±×÷Óá£

1.ÐÔÄÜ¿ªÏú

·´ÉäÉæ¼°ÀàÐͶ¯Ì¬½âÎö£¬ËùÒÔ JVM ÎÞ·¨¶ÔÕâЩ´úÂë½øÐÐÓÅ»¯¡£Òò´Ë£¬·´Éä²Ù×÷µÄЧÂÊÒª±ÈÄÇЩ·Ç·´Éä²Ù×÷µÍµÃ¶à¡£ÎÒÃÇÓ¦¸Ã±ÜÃâÔÚ¾­³£±»Ö´ÐеĴúÂë»ò¶ÔÐÔÄÜÒªÇóºÜ¸ßµÄ³ÌÐòÖÐʹÓ÷´Éä¡£

2.°²È«ÏÞÖÆ

ʹÓ÷´Éä¼¼ÊõÒªÇó³ÌÐò±ØÐëÔÚÒ»¸öûÓа²È«ÏÞÖÆµÄ»·¾³ÖÐÔËÐС£Èç¹ûÒ»¸ö³ÌÐò±ØÐëÔÚÓа²È«ÏÞÖÆµÄ»·¾³ÖÐÔËÐУ¬Èç Applet£¬ÄÇôÕâ¾ÍÊǸöÎÊÌâÁË¡£

3.ÄÚ²¿ÆØ¹â

ÓÉÓÚ·´ÉäÔÊÐí´úÂëÖ´ÐÐһЩÔÚÕý³£Çé¿öϲ»±»ÔÊÐíµÄ²Ù×÷£¨±ÈÈç·ÃÎÊ˽ÓеÄÊôÐԺͷ½·¨£©£¬ËùÒÔʹÓ÷´Éä¿ÉÄܻᵼÖÂÒâÁÏÖ®ÍâµÄ¸±×÷Óã­£­´úÂëÓй¦ÄÜÉϵĴíÎ󣬽µµÍ¿ÉÒÆÖ²ÐÔ¡£·´Éä´úÂëÆÆ»µÁ˳éÏóÐÔ£¬Òò´Ëµ±Æ½Ì¨·¢Éú¸Ä±äµÄʱºò£¬´úÂëµÄÐÐΪ¾ÍÓпÉÄÜÒ²Ëæ×ű仯¡£

ʹÓ÷´ÉäµÄÒ»¸öÔ­Ôò£ºÈç¹ûʹÓ󣹿·½·¨Äܹ»ÊµÏÖ£¬ÄÇô¾Í²»ÒªÓ÷´Éä¡£

 
   
2280 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
 
×îÐÂÎÄÕÂ
JavaÐéÄâ»ú¼Ü¹¹
JVM¡ª¡ªJavaÐéÄâ»ú¼Ü¹¹
JavaÈÝÆ÷Ïê½â
Java½ø½×--ÉîÈëÀí½âArrayListʵÏÖÔ­Àí
Java²¢·¢ÈÝÆ÷£¬µ×²ãÔ­ÀíÉîÈë·ÖÎö
×îпγÌ
java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
SpringBoot&Cloud¡¢JavaSSM¿ò¼Ü
Spring Boot Åàѵ
³É¹¦°¸Àý
¹úÄÚÖªÃûÒøÐÐ Spring+SpringBoot+Cloud+MVC
±±¾© Java±à³Ì»ù´¡ÓëÍøÒ³¿ª·¢»ù´¡
±±¾© Struts+Spring
»ªÏÄ»ù½ð ActiveMQ Ô­Àí
ijÃñº½¹« Java»ù´¡±à³Ìµ½Ó¦Óÿª·¢