±à¼ÍƼö: |
±¾ÎÄÏà¹ØÖªÊ¶µã´ó²¿·Ö×ܽá×Ô
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 µÈÀàËÆ
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.ÄÚ²¿ÆØ¹â
ÓÉÓÚ·´ÉäÔÊÐí´úÂëÖ´ÐÐһЩÔÚÕý³£Çé¿öϲ»±»ÔÊÐíµÄ²Ù×÷£¨±ÈÈç·ÃÎÊ˽ÓеÄÊôÐԺͷ½·¨£©£¬ËùÒÔʹÓ÷´Éä¿ÉÄܻᵼÖÂÒâÁÏÖ®ÍâµÄ¸±×÷Ó㣴úÂëÓй¦ÄÜÉϵĴíÎ󣬽µµÍ¿ÉÒÆÖ²ÐÔ¡£·´Éä´úÂëÆÆ»µÁ˳éÏóÐÔ£¬Òò´Ëµ±Æ½Ì¨·¢Éú¸Ä±äµÄʱºò£¬´úÂëµÄÐÐΪ¾ÍÓпÉÄÜÒ²Ëæ×ű仯¡£
ʹÓ÷´ÉäµÄÒ»¸öÔÔò£ºÈç¹ûʹÓ󣹿·½·¨Äܹ»ÊµÏÖ£¬ÄÇô¾Í²»ÒªÓ÷´Éä¡£ |