±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁËElasticsearchÊÇʲô£¿ÎªÊ²Ã´Ñ¡ÔñElasticsearch£¿ÈçºÎʹÓÃElasticsearch£¿
±¾ÎÄÀ´×ÔÓÚ²©¿ÍÔ°£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£
|
|
Ò»¡¢·´ÉäµÄ¸ÅÄî¼°ÔÚJavaÖеÄÀà·´Éä
·´ÉäÖ÷ÒªÊÇÖ¸³ÌÐò¿ÉÒÔ·ÃÎÊ¡¢¼ì²âºÍÐÞ¸ÄËü±¾Éí״̬»òÐÐΪµÄÒ»ÖÖÄÜÁ¦¡£ÔÚ¼ÆËã»ú¿ÆÑ§ÁìÓò£¬·´ÉäÊÇÒ»ÀàÓ¦Óã¬ËüÃÇÄܹ»×ÔÃèÊöºÍ×Ô¿ØÖÆ¡£ÕâÀàÓ¦ÓÃͨ¹ýijÖÖ»úÖÆÀ´ÊµÏÖ¶Ô×Ô¼ºÐÐΪµÄÃèÊöºÍ¼ì²â£¬²¢Äܸù¾Ý×ÔÉíÐÐΪµÄ״̬ºÍ½á¹û£¬µ÷Õû»òÐÞ¸ÄÓ¦ÓÃËùÃèÊöÐÐΪµÄ״̬ºÍÏà¹ØµÄÓïÒå¡£
ÔÚJavaÖеķ´Éä»úÖÆ£¬±»³ÆÎªReflection¡££¨´ó¼Ò¿´µ½Õâ¸öµ¥´Ê£¬µÚÒ»¸öÏë·¨Ó¦¸Ã¾ÍÊÇÈ¥¿ª·¢ÎĵµÖÐËÑÒ»ÏÂÁË¡££©ËüÔÊÐíÔËÐÐÖеÄJava³ÌÐò¶Ô×ÔÉí½øÐмì²é£¬²¢ÄÜÖ±½Ó²Ù×÷³ÌÐòµÄÄÚ²¿ÊôÐÔ»ò·½·¨¡£Reflection»úÖÆÔÊÐí³ÌÐòÔÚÕýÔÚÖ´ÐеĹý³ÌÖУ¬ÀûÓÃReflection
APIsÈ¡µÃÈκÎÒÑÖªÃû³ÆµÄÀàµÄÄÚ²¿ÐÅÏ¢£¬°üÀ¨£ºpackage¡¢ type parameters¡¢ superclass¡¢
implemented interfaces¡¢ inner classes¡¢ outer classes¡¢
fields¡¢ constructors¡¢ methods¡¢ modifiersµÈ£¬²¢¿ÉÒÔÔÚÖ´ÐеĹý³ÌÖУ¬¶¯Ì¬Éú³ÉInstances¡¢±ä¸üfieldsÄÚÈÝ»ò»½Æðmethods¡£
ºÃ£¬Á˽âÕâЩ£¬ÄÇÎÒÃǾÍÖªµÀÁË£¬ÎÒÃÇ¿ÉÒÔÀûÓ÷´Éä»úÖÆÔÚJava³ÌÐòÖУ¬¶¯Ì¬µÄÈ¥µ÷ÓÃһЩprotectedÉõÖÁÊÇprivateµÄ·½·¨»òÀ࣬ÕâÑù¿ÉÒԺܴó³Ì¶ÈÉÏÂú×ãÎÒÃǵÄһЩ±È½ÏÌØÊâÐèÇó¡£Ä㵱Ȼ»áÎÊ£¬·´Éä»úÖÆÔÚAndroidƽ̨ÏÂÓкÎÓô¦ÄØ£¿
ÎÒÃÇÔÚ½øÐÐAndroid³ÌÐòµÄ¿ª·¢Ê±£¬ÎªÁË·½±ãµ÷ÊÔ³ÌÐò£¬²¢¿ìËÙ¶¨Î»³ÌÐòµÄ´íÎóµã£¬»á´ÓÍøÉÏÏÂÔØµ½¶ÔÓ¦°æ±¾µÄAndroid
SDKµÄÔ´Â루ÕâÀï¸ø´ó¼ÒÌṩһ¸ö2.3.3°æ±¾µÄÏÂÔØÁ´½Ó£©¡£Äã»á·¢ÏֺܶàÀà»ò·½·¨Öо³£¼ÓÉÏÁË¡°@hide¡±×¢Êͱê¼Ç£¬ËüµÄ×÷ÓÃÊÇʹÕâ¸ö·½·¨»òÀàÔÚÉú³ÉSDKʱ²»¿É¼û£¬ÄÇôÎÒÃǵijÌÐò¿ÉÄÜÎÞ·¨±àÒëͨ¹ý£¬¶øÇÒÔÚ×îÖÕ·¢²¼µÄʱºò£¬¾Í¿ÉÄÜ´æÔÚһЩÎÊÌâ¡£
ÄÇô£¬¶ÔÓÚÕâ¸öÎÊÌ⣬µÚÒ»ÖÖ·½·¨¾ÍÊÇ×Ô¼ºÈ¥µôAndroidÔ´ÂëÖеÄ"@hide"±ê¼Ç£¬È»ºóÖØÐ±àÒëÉú³ÉÒ»¸öSDK¡£ÁíÒ»ÖÖ·½·¨¾ÍÊÇʹÓÃJava·´Éä»úÖÆÁË£¬¿ÉÒÔÀûÓÃÕâÖÖ·´Éä»úÖÆ·ÃÎÊ´æÔÚ·ÃÎÊȨÏ޵ķ½·¨»òÐÞ¸ÄÆäÓò¡£
·Ï»°°ëÌ죬¸ÃÈëÕýÌâÁË£¬ÔÚ½øÈëÕýÌâ֮ǰ£¬ÏȸøÉÏÒ»¸ö·´Éä²âÊÔÀàµÄ´úÂ룬¸Ã´úÂëÖж¨ÒåÁËÎÒÃÇÐèÒª½øÐз´ÉäµÄÀ࣬¸ÃÀಢûÓÐʵ¼ÊµÄÓÃ;£¬½ö¹©×öΪ²âÊÔÀà¡£Ìáʾ£º±¾ÎÄÌṩµÄ´úÂ룬²¢²»ÊÇAndroidƽ̨ϵĴúÂ룬¶øÊÇÒ»¸öÆÕͨµÄJava³ÌÐò£¬½ö½öÊǶÔJava·´Éä»úÖÆµÄDemo³ÌÐò£¬ËùÒÔ´ó¼Ò²»Òª·ÅÔÚAndroidϱàÒë°¡£¬·ñÔò³öÏÖÎÊÌ⣬±ð×·¾¿ÎÒµÄÔðÈÎÀ²£¡
package crazypebble.reflectiontest;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.Serializable;
public class ReflectionTest extends Object implements
ActionListener,Serializable{ // ³ÉÔ±±äÁ¿
private int bInt;
public Integer bInteger = new Integer(4);
public String strB = "crazypebble";
private String strA;
// ¹¹Ô캯Êý
public ReflectionTest() {
}
protected ReflectionTest (int id, String name)
{
}
// ³ÉÔ±·½·¨
public int abc(int id, String name) {
System.out.println ("crazypebble --->
" + id + "-" + name);
return 0;
}
protected static void edf() {
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
} |
¶þ¡¢·´Éä»úÖÆÖÐÐèҪʹÓõ½µÄÀà
ÎÒ°ÑÐèҪʹÓõÄÀàÁÐÔÚϱíÖУ¬ÆäÖжÔÎÒÃÇÌØ±ðÓÐÓõÄÀ࣬ͨ¹ý×ÅÖØ±ê¼ÇÏÔʾ³öÀ´£¬²¢½«ÔÚºóÃæµÄʹÓÃÖÐÖð²½½âÊÍ£º

Èý¡¢ClassÀà
Ê×ÏÈÏò´ó¼Ò˵Ã÷Ò»µã£¬Class±¾Éí¾ÍÊÇÒ»¸öÀ࣬ClassÊǸÃÀàµÄÃû³Æ¡£¿´ÒÔÏÂÏÂÃæÕâ¸öÀàµÄ¶¨Ò壺
public class MyButton extends Button {...}
×¢Òâµ½ÉÏÃæµÄclassµÄÊ××ÖĸÊÇСд£¬Ëü±íʾµÄÊÇÒ»ÖÖÀàÀàÐÍ£¬µ«ÊÇÎÒÃǵÄClassÊÇÒ»¸öÀ࣬Ï൱ÓÚÉÏÃæ¶¨ÒåµÄMyButtonÀà¡£ËùÒÔ£¬Ç§Íò²»Òª°ÑÕâÀïµÄClass×öΪһ¸öÀàÀàÐÍÀ´Àí½â¡£Ã÷°×ÕâÒ»µã£¬ÎÒÃǼÌÐø¡£
ClassÀàÊÇÕû¸öJava·´Éä»úÖÆµÄÔ´Í·£¬ClassÀà±¾Éí±íʾJava¶ÔÏóµÄÀàÐÍ£¬ÎÒÃÇ¿Éͨ¹ýÒ»¸öObject¶ÔÏóµÄgetClass()·½·¨È¡µÃÒ»¸ö¶ÔÏóµÄÀàÐÍ£¬´Ëº¯Êý·µ»ØµÄ¾ÍÊÇÒ»¸öClassÀà¡£»ñÈ¡Class¶ÔÏóµÄ·½·¨ÓкܶàÖÖ£º

ÔÚÆ½Ê±µÄʹÓã¬Òª×¢Òâ¶ÔÕ⼸ÖÖ·½·¨µÄÁé»îÔËÓã¬ÓÈÆäÊǶÔClass.forName()·½·¨µÄʹÓá£ÒòΪÔںܶ࿪·¢ÖУ¬»áÖ±½Óͨ¹ýÀàµÄÃû³ÆÈ¡µÃClassÀàµÄ¶ÔÏó¡£
ËÄ¡¢»ñÈ¡ÀàµÄÏà¹ØÐÅÏ¢
1¡¢»ñÈ¡¹¹Ôì·½·¨
ClassÀàÌṩÁËËĸöpublic·½·¨£¬ÓÃÓÚ»ñȡij¸öÀàµÄ¹¹Ôì·½·¨¡£
Constructor getConstructor(Class[] params) ¸ù¾Ý¹¹Ô캯ÊýµÄ²ÎÊý£¬·µ»ØÒ»¸ö¾ßÌåµÄ¾ßÓÐpublicÊôÐԵĹ¹Ô캯Êý
Constructor getConstructors() ·µ»ØËùÓоßÓÐpublicÊôÐԵĹ¹Ô캯ÊýÊý×é
Constructor getDeclaredConstructor(Class[] params)
¸ù¾Ý¹¹Ô캯ÊýµÄ²ÎÊý£¬·µ»ØÒ»¸ö¾ßÌåµÄ¹¹Ô캯Êý£¨²»·ÖpublicºÍ·ÇpublicÊôÐÔ£©
Constructor getDeclaredConstructors() ·µ»Ø¸ÃÀàÖÐËùÓеĹ¹Ô캯ÊýÊý×飨²»·ÖpublicºÍ·ÇpublicÊôÐÔ£©
ÓÉÓÚJavaÓïÑÔÊÇÒ»ÖÖÃæÏò¶ÔÏóµÄÓïÑÔ£¬¾ßÓжà̬µÄÐÔÖÊ£¬ÄÇôÎÒÃÇ¿ÉÒÔͨ¹ý¹¹Ôì·½·¨µÄ²ÎÊýÁбíµÄ²»Í¬£¬À´µ÷Óò»Í¬µÄ¹¹Ôì·½·¨È¥´´½¨ÀàµÄʵÀý¡£Í¬Ñù£¬»ñÈ¡²»Í¬µÄ¹¹Ôì·½·¨µÄÐÅÏ¢£¬Ò²ÐèÒªÌṩÓëÖ®¶ÔÓ¦µÄ²ÎÊýÀàÐÍÐÅÏ¢£»Òò´Ë£¬¾Í²úÉúÁËÒÔÉÏËÄÖÖ²»Í¬µÄ»ñÈ¡¹¹Ôì·½·¨µÄ·½Ê½¡£
/**
* »ñÈ¡·´ÉäÀàÖеĹ¹Ôì·½·¨
* Êä³ö´òÓ¡¸ñʽ£º"ModifierÐÞÊÎÓò ¹¹Ôì·½·¨Ãû(²ÎÊýÀàÐÍÁбí)"
*/
public static void get_Reflection_Constructors( ReflectionTest
r) {
Class temp = r.getClass();
String className = temp.getName(); // »ñȡָ¶¨ÀàµÄÀàÃû
try {
Constructor[] theConstructors = temp.getDeclaredConstructors();
// »ñȡָ¶¨ÀàµÄ¹«Óй¹Ôì·½·¨
for (int i = 0; i < theConstructors.length;
i++) {
int mod = theConstructors[i].getModifiers();
// Êä³öÐÞÊÎÓòºÍ·½·¨Ãû³Æ
System.out.print( Modifier.toString(mod) + "
" + className + "("); Class[] parameterTypes = theConstructors[
i ].getParameterTypes(); // »ñȡָ¶¨¹¹Ôì·½·¨µÄ²ÎÊýµÄ¼¯ºÏ
for (int j = 0; j < parameterTypes.length;
j++) { // Êä³ö´òÓ¡²ÎÊýÁбí
System.out.print( parameterTypes[j].getName());
if (parameterTypes.length > j+1) {
System.out.print(", ");
}
}
System.out.println(")");
}
} catch (Exception e) {
e.printStackTrace();
}
} |
2¡¢»ñÈ¡ÀàµÄ³ÉÔ±·½·¨
Óë»ñÈ¡¹¹Ôì·½·¨µÄ·½Ê½Ïàͬ£¬´æÔÚËÄÖÖ»ñÈ¡³ÉÔ±·½·¨µÄ·½Ê½¡£
Method getMethod(String name, Class[] params)
¸ù¾Ý·½·¨ÃûºÍ²ÎÊý£¬·µ»ØÒ»¸ö¾ßÌåµÄ¾ßÓÐpublicÊôÐԵķ½·¨
Method[] getMethods() ·µ»ØËùÓоßÓÐpublicÊôÐԵķ½·¨Êý×é
Method getDeclaredMethod(String name, Class[]
params) ¸ù¾Ý·½·¨ÃûºÍ²ÎÊý£¬·µ»ØÒ»¸ö¾ßÌåµÄ·½·¨£¨²»·ÖpublicºÍ·ÇpublicÊôÐÔ£©
Method[] getDeclaredMethods() ·µ»Ø¸ÃÀàÖеÄËùÓеķ½·¨Êý×飨²»·ÖpublicºÍ·ÇpublicÊôÐÔ£©
/**
* »ñÈ¡·´ÉäÀàµÄ·½·¨
* ´òÓ¡Êä³ö¸ñʽ£º "RetType FuncName( paramTypeList)"
*/
public static void get_Reflection_Method( ReflectionTest
r) {
Class temp = r.getClass();
String className = temp.getName();
/*
* Note: ·½·¨getDeclaredMethods()Ö»ÄÜ»ñÈ¡µ½Óɵ±Ç°ÀඨÒåµÄËùÓз½·¨£¬²»ÄÜ»ñÈ¡´Ó¸¸Àà¼Ì³ÐµÄ·½·¨
* ·½·¨getMethods() ²»½öÄÜ»ñÈ¡µ½µ±Ç°ÀඨÒåµÄpublic·½·¨£¬Ò²Äܵõ½´Ó¸¸Àà¼Ì³ÐºÍÒѾʵÏÖ½Ó¿ÚµÄpublic·½·¨
* Çë²éÔÄ¿ª·¢Îĵµ¶ÔÕâÁ½¸ö·½·¨µÄÏêϸÃèÊö¡£
*/
//Method[] methods = temp.getDeclaredMethods();
Method[] methods = temp.getMethods();
for (int i = 0; i < methods.length; i++)
{
// ´òÓ¡Êä³ö·½·¨µÄÐÞÊÎÓò
int mod = methods[i].getModifiers();
System.out.print( Modifier.toString(mod) + "
");
// Êä³ö·½·¨µÄ·µ»ØÀàÐÍ
System.out.print( methods[i].getReturnType().getName());
// »ñÈ¡Êä³öµÄ·½·¨Ãû
System.out.print(" " + methods[i].getName()
+ "(");
// ´òÓ¡Êä³ö·½·¨µÄ²ÎÊýÁбí
Class[] parameterTypes = methods[i].getParameterTypes();
for (int j = 0; j < parameterTypes.length;
j++) {
System.out.print (parameterTypes[j].getName());
if (parameterTypes.length > j+1) {
System.out.print(", ");
}
}
System.out.println(")");
}
}
|
ÔÚ»ñÈ¡ÀàµÄ³ÉÔ±·½·¨Ê±£¬ÓÐÒ»¸öµØ·½ÖµµÃ´ó¼Ò×¢Ò⣬¾ÍÊÇgetMethods()·½·¨ºÍgetDeclaredMethods()·½·¨¡£
getMethods()£ºÓÃÓÚ»ñÈ¡ÀàµÄËùÓеÄpublicÐÞÊÎÓòµÄ³ÉÔ±·½·¨£¬°üÀ¨´Ó¸¸Àà¼Ì³ÐµÄpublic·½·¨ºÍʵÏÖ½Ó¿ÚµÄpublic·½·¨£»
getDeclaredMethods()£ºÓÃÓÚ»ñÈ¡ÔÚµ±Ç°ÀàÖж¨ÒåµÄËùÓеijÉÔ±·½·¨ºÍʵÏֵĽӿڷ½·¨£¬²»°üÀ¨´Ó¸¸Àà¼Ì³ÐµÄ·½·¨¡£
´ó¼Ò¿ÉÒԲ鿼һÏ¿ª·¢ÎĵµµÄ½âÊÍ£º
getMethods() - Returns an array containing Method
objects for all public methods for the class C represented
by this Class.
Methods may be declared in C, the interfaces
it implements or in the superclasses of C.
The elements in the returned array are in
no particular order. getDeclaredMethods() - Returns a Method object which
represents the method matching the specified name
and parameter types
that is declared by the class represented
by this Class.
Òò´ËÔÚʾÀý´úÂëµÄ·½·¨get_Reflection_Method(...)ÖУ¬ReflectionTestÀà¼Ì³ÐÁËObjectÀ࣬ʵÏÖÁËactionPerformed·½·¨£¬²¢¶¨ÒåÈçϳÉÔ±·½·¨£º

ͨ¹ýÕâÁ½¸öÓï¾äÖ´ÐкóµÄ½á¹û²»Í¬£º
a¡¢Method[] methods = temp.getDeclaredMethods()Ö´Ðкó½á¹ûÈçÏ£º

b¡¢Method[] methods = temp.getMethods()Ö´Ðк󣬽á¹ûÈçÏ£º

3¡¢»ñÈ¡ÀàµÄ³ÉÔ±±äÁ¿£¨³ÉÔ±ÊôÐÔ£©
´æÔÚËÄÖÖ»ñÈ¡³ÉÔ±ÊôÐԵķ½·¨
Field getField(String name) ¸ù¾Ý±äÁ¿Ãû£¬·µ»ØÒ»¸ö¾ßÌåµÄ¾ßÓÐpublicÊôÐԵijÉÔ±±äÁ¿
Field[] getFields() ·µ»Ø¾ßÓÐpublicÊôÐԵijÉÔ±±äÁ¿µÄÊý×é
Field getDeclaredField(String name) ¸ù¾Ý±äÁ¿Ãû£¬·µ»ØÒ»¸ö³ÉÔ±±äÁ¿£¨²»·ÖpublicºÍ·ÇpublicÊôÐÔ£©
Field[] getDelcaredField() ·µ»ØËùÓгÉÔ±±äÁ¿×é³ÉµÄÊý×飨²»·ÖpublicºÍ·ÇpublicÊôÐÔ£©
/**
* »ñÈ¡·´ÉäÀàÖеÄÊôÐÔºÍÊôÐÔÖµ
* Êä³ö´òÓ¡¸ñʽ£º"Modifier Type : Name = Value"
* Note: ¶ÔÓÚδ³õʼ»¯µÄÖ¸ÕëÀàÐ͵ÄÊôÐÔ£¬½«²»Êä³ö½á¹û
*/
public static void get_Reflection_Field_Value( ReflectionTest
r) {
Class temp = r.getClass(); // »ñÈ¡ClassÀàµÄ¶ÔÏóµÄ·½·¨Ö®Ò»
try {
System.out.println("public ÊôÐÔ");
Field[] fb = temp.getFields();
for (int i = 0; i < fb.length; i++) {
Class cl = fb[i].getType(); // ÊôÐÔµÄÀàÐÍ
int md = fb[i].getModifiers(); // ÊôÐÔµÄÐÞÊÎÓò
Field f = temp.getField(fb[i].getName()); //
ÊôÐÔµÄÖµ
f.setAccessible(true);
Object value = (Object)f.get(r);
// ÅжÏÊôÐÔÊÇ·ñ±»³õʼ»¯
if (value == null) {
System.out.println( Modifier.toString(md) +
" " + cl + " : " + fb[i].getName());
}
else {
System.out.println( Modifier.toString(md) + "
" + cl + " : " + fb[i].getName()
+ " = " + value.toString());
}
}
System.out.println ("public & ·Çpublic
ÊôÐÔ");
Field[] fa = temp.getDeclaredFields();
for (int i = 0; i < fa.length; i++) {
Class cl = fa[i].getType(); // ÊôÐÔµÄÀàÐÍ
int md = fa[i].getModifiers(); // ÊôÐÔµÄÐÞÊÎÓò
Field f = temp.getDeclaredField(fa[i].getName());
// ÊôÐÔµÄÖµ
f.setAccessible(true); // Very Important
Object value = (Object) f.get(r);
if (value == null) {
System.out.println( Modifier.toString(md ) +
" " + cl + " : " + fa[i].getName());
}
else {
System.out.println( Modifier.toString(md ) +
" " + cl + " : " + fa[i].getName()
+ " = " + value.toString());
}
}
} catch (Exception e) {
e.printStackTrace();
}
} |
4¡¢»ñÈ¡Àà¡¢ÊôÐÔ¡¢·½·¨µÄÐÞÊÎÓò
ÀàClass¡¢Method¡¢Constructor¡¢Field¶¼ÓÐÒ»¸öpublic·½·¨int
getModifiers()¡£¸Ã·½·¨·µ»ØÒ»¸öintÀàÐ͵ÄÊý£¬±íʾ±»ÐÞÊζÔÏó£¨ Class¡¢ Method¡¢
Constructor¡¢ Field £©µÄÐÞÊÎÀàÐ͵Ä×éºÏÖµ¡£
ÔÚ¿ª·¢ÎĵµÖУ¬¿ÉÒÔ²éÔĵ½£¬ModifierÀàÖж¨ÒåÁËÈô¸ÉÌØ¶¨µÄÐÞÊÎÓò£¬Ã¿¸öÐÞÊÎÓò¶¼ÊÇÒ»¸ö¹Ì¶¨µÄintÊýÖµ£¬ÁбíÈçÏ£º

¸ÃÀ಻½öÌṩÁËÈô¸ÉÓÃÓÚÅжÏÊÇ·ñÓµÓÐijÖÐÐÞÊÎÓòµÄ·½·¨boolean isXXXXX(int modifiers)£¬»¹Ìṩһ¸öString
toString(int modifier)·½·¨£¬ÓÃÓÚ½«Ò»¸ö±íʾÐÞÊÎÓò×éºÏÖµµÄintÊýת»»³ÉÃèÊöÐÞÊÎÓòµÄ×Ö·û´®¡£

Îå¡¢ÈçºÎµ÷ÓÃÀàÖеÄprivate·½·¨
ÔÚ½éÉÜ֮ǰ£¬ÏÈ·ÅÒ»¸ö´úÂë°É£¬Õâ¶Î´úÂëÊDzο¼ÆäËûÎÄÕµĴúÂ뿽±´¹ýÀ´µÄ£¬´úÂë²»Ë㳤£¬µ«ÊǶ¯Ì¬µ÷ÓÃÀàµÄ³ÉÔ±·½·¨µÄ¹ý³Ì½²½âµÄͨË×Ò×¶®¡£
package crazypebble.reflectiontest; import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class LoadMethod { /**
* ÔÚÔËÐÐʱ¼ÓÔØÖ¸¶¨µÄÀ࣬²¢µ÷ÓÃÖ¸¶¨µÄ·½·¨
* @param cName JavaµÄÀàÃû
* @param MethodName ·½·¨Ãû
* @param types ·½·¨µÄ²ÎÊýÀàÐÍ
* @param params ·½·¨µÄ²ÎÊýÖµ
* @return
*/
public Object Load( String cName, String MethodName,
String[] types, String[] params) {
Object retObject = null;
try {
// ¼ÓÔØÖ¸¶¨µÄÀà
Class cls = Class.forName(cName); // »ñÈ¡ClassÀàµÄ¶ÔÏóµÄ·½·¨Ö®¶þ
// ÀûÓÃnewInstance()·½·¨£¬»ñÈ¡¹¹Ôì·½·¨µÄʵÀý
// ClassµÄnewInstance·½·¨Ö»ÌṩĬÈÏÎ޲ι¹ÔìʵÀý
// ConstructorµÄnewInstance·½·¨Ìṩ´ø²ÎµÄ¹¹ÔìʵÀý
Constructor ct = cls.getConstructor(null);
Object obj = ct.newInstance(null);
//Object obj = cls.newInstance();
// ¹¹½¨ ·½·¨µÄ²ÎÊýÀàÐÍ
Class paramTypes[] = this.getMethodTypesClass( types);
// ÔÚÖ¸¶¨ÀàÖлñȡָ¶¨µÄ·½·¨
Method meth = cls.getMethod( MethodName, paramTypes);
// ¹¹½¨ ·½·¨µÄ²ÎÊýÖµ
Object argList[] = this.getMethodParamObject(types,
params);
// µ÷ÓÃÖ¸¶¨µÄ·½·¨²¢»ñÈ¡·µ»ØÖµÎªObjectÀàÐÍ
retObject = meth.invoke(obj, argList);
} catch (Exception e) {
System.err.println(e);
}
return retObject;
}
/**
* »ñÈ¡²ÎÊýÀàÐÍ£¬·µ»ØÖµ±£´æÔÚClass[]ÖÐ
*/
public Class[] getMethodTypesClass(String[]
types) {
Class[] cs = new Class[types.length];
for (int i = 0; i < cs.length; i++) {
if (types[i] != null || !types[i].trim().equals(""))
{
if (types[i].equals("int") || types[i].equals("Integer"))
{
cs[i] = Integer.TYPE;
}
else if (types[i].equals( "float")
|| types[i].equals( "Float")) {
cs[i] = Float.TYPE;
}
else if (types[i].equals("double")
|| types[i].equals("Double")) {
cs[i] = Double.TYPE;
}
else if (types[i].equals("boolean")
|| types[i].equals("Boolean")) {
cs[i] = Boolean.TYPE;
}
else {
cs[i] = String.class;
}
}
}
return cs;
}
/**
* »ñÈ¡²ÎÊýObject[]
*/
public Object[] getMethodParamObject( String[]
types, String[] params) {
Object[] retObjects = new Object[params.length];
for (int i = 0; i < retObjects.length; i++)
{
if(!params[i].trim().equals("")||params[i]!=null){
if(types[i].equals("int")||types[i].equals("Integer")){
retObjects[i]= new Integer(params[i]);
}
else if(types[i].equals("float")||types[i].equals("Float")){
retObjects[i]= new Float(params[i]);
}
else if(types[i].equals("double")||types[i].equals("Double")){
retObjects[i]= new Double(params[i]);
}
else if(types[i].equals("boolean")||types[i].equals("Boolean")){
retObjects[i]=new Boolean(params[i]);
}
else{
retObjects[i] = params[i];
}
}
}
return retObjects;
}
} |
Òªµ÷ÓÃÒ»¸öÀàµÄ·½·¨£¬Ê×ÏÈÐèÒªÒ»¸ö¸ÃÀàµÄʵÀý£¨µ±È»£¬Èç¹û¸ÃÀàÊÇstatic£¬¾Í²»ÐèҪʵÀýÁË£¬ÖÁÓÚÔÒò£¬Äã¶®µÃ£¡£©¡£
1¡¢´´½¨Ò»¸öÀàµÄʵÀý
Ôڵõ½Ò»¸öÀàµÄClass¶ÔÏóÖ®ºó£¬ÎÒÃÇ¿ÉÒÔÀûÓÃÀàConstructorȥʵÀý»¯¸Ã¶ÔÏó¡£ConstructorÖ§³Ö·ºÐÍ£¬Ò²¾ÍÊÇËü±¾ÉíÓ¦¸ÃÊÇConstructor<T>¡£Õâ¸öÀàÓÐÒ»¸öpublic³ÉÔ±º¯Êý£ºT
newInstance(Object... args),ÆäÖÐargsΪ¶ÔÓ¦µÄ²ÎÊý£¬ÎÒÃÇͨ¹ýConstructorµÄÕâ¸ö·½·¨À´´´½¨ÀàµÄ¶ÔÏóʵÀý¡£
ÔÚ´úÂëLoadMethod.javaºÍLoadMethodEx.javaÖУ¬·Ö±ð¸ø³öÁËÁ½ÖÖʵÀý»¯ClassÀàµÄ·½·¨£ºÒ»ÖÖÊÇÀûÓÃConstructorÀàµ÷ÓÃnewInstance()·½·¨£»ÁíÒ»ÖÖ¾ÍÊÇÀûÓÃClassÀà±¾ÉíµÄnewInstance()·½·¨´´½¨Ò»¸öʵÀý¡£Á½ÖÖ·½·¨ÊµÏÖµÄЧ¹ûÊÇÒ»ÑùµÄ¡£
// ÀûÓÃnewInstance()·½·¨£¬»ñÈ¡¹¹Ôì·½·¨µÄʵÀý // ClassµÄnewInstance·½·¨£¬½öÌṩĬÈÏÎ޲εÄʵÀý»¯·½·¨£¬ÀàËÆÓÚÎ޲εĹ¹Ôì·½·¨ // ConstructorµÄnewInstance·½·¨£¬ÌṩÁË´ø²ÎÊýµÄʵÀý»¯·½·¨£¬ÀàËÆÓÚº¬²ÎµÄ¹¹Ôì·½·¨
Constructor ct = cls.getConstructor(null); Object obj = ct.newInstance(null); Object obj = cls.newInstance(); |
2¡¢ÐÐΪ
MethodÀàÖаüº¬×ÅÀàµÄ³ÉÔ±·½·¨µÄÐÅÏ¢¡£ÔÚMethodÀàÖÐÓÐÒ»¸öpublic³ÉÔ±º¯Êý£ºObject
invoke(Object receiver, Object... args)£¬²ÎÊýreceiverÖ¸Ã÷Á˵÷ÓöÔÏ󣬲ÎÊýargsÖ¸Ã÷Á˸÷½·¨ËùÐèÒª½ÓÊյIJÎÊý¡£ÓÉÓÚÎÒÃÇÊÇÔÚÔËÐÐʱ¶¯Ì¬µÄµ÷ÓÃÀàµÄ·½·¨£¬ÎÞ·¨Ìáǰ֪µÀ¸ÃÀàµÄ²ÎÊýÀàÐͺͷµ»ØÖµÀàÐÍ£¬ËùÒÔ´«ÈëµÄ²ÎÊýµÄÀàÐÍÊÇObject£¬·µ»ØµÄÀàÐÍÒ²ÊÇObject¡££¨ÒòΪObjectÀàÊÇËùÓÐÆäËûÀàµÄ¸¸Àࣩ
Èç¹ûijһ¸ö·½·¨ÊÇJavaÀàµÄ¾²Ì¬·½·¨£¬ÄÇôObject receiver²ÎÊý¿ÉÒÔ´«Èënull£¬ÒòΪ¾²Ì¬·½·¨´Ó²»ÊôÓÚ¶ÔÏó¡£
3¡¢ÊôÐÔ
¶ÔÀàµÄ³ÉÔ±±äÁ¿½øÐжÁд£¬ÔÚFieldÀàÖÐÓÐÁ½¸öpublic·½·¨£º
Object get(Object object)£¬¸Ã·½·¨¿ÉÓÃÓÚ»ñȡij³ÉÔ±±äÁ¿µÄÖµ
Void set(Object object, Object value)£¬¸Ã·½·¨ÉèÖÃij³ÉÔ±±äÁ¿µÄÖµ
ÆäÖУ¬Object²ÎÊýÊÇÐèÒª´«ÈëµÄ¶ÔÏó£»Èç¹û³ÉÔ±±äÁ¿ÊǾ²Ì¬ÊôÐÔ£¬ÔÚobject¿É´«Èënull¡£
Áù¡¢¶ÔLoadMethod.javaµÄÓÅ»¯´¦Àí
ÔÚÉÏÒ»½ÚÖиø³öµÄLoadMethod.javaÖУ¬ÀàLoadMethod¶Ô¹Ì¶¨²ÎÊýÀàÐ͵ķ½·¨½øÐÐÁ˵÷Ó㬲¢ÇÒ²ÎÊýÀàÐÍÊÇͨ¹ýÒ»¸öString[]Êý×é´«È룬Ȼºó¾¹ý·½·¨
getMethodTypesClass() ½âÎöÖ®ºó£¬²ÅµÃµ½Á˲ÎÊýµÄ¾ßÌåµÄÀàÐÍ¡£Í¬Ê±ÔÚgetMethodTypesClass()ºÍgetMethodParamObject()·½·¨ÖУ¬Í¨¹ý¶Ô´«ÈëµÄ×Ö·û´®²ÎÊý½øÐйýÂ˺ó£¬ÔÙ´¦ÀíÄÇЩ¿ÉÒÔÆ¥ÅäÖеIJÎÊýÀàÐÍ£¬ÆäËû²»ÄÜÆ¥ÅäµÄ²ÎÊý¶¼×öΪString¶ÔÏóÀ´´¦Àí¡£Èç¹ûÎÒÃǵ÷Óõķ½·¨ËùÐèÒªµÄ²ÎÊý²»ÊǼòµ¥ÀàÐ͵ıäÁ¿£¬¶øÊÇ×Ô¶¨ÒåµÄÀà¶ÔÏ󣬻òÕßListÁÐ±í£¬ÔÙÈç¹ûÎÒÃÇÖ»ÖªµÀÀàÃûºÍ·½·¨Ãû£¬²»ÖªµÀ·½·¨µÄ²ÎÊýÀàÐÍ£¬ÄÇÎÒÃǸÃÈçºÎ´¦ÀíÕâЩÇé¿öÄØ£¿
Òò´Ë£¬ÎÒ¶ÔLoadMethodÀà½øÐÐÁËÒ»¶¨µÄÓÅ»¯´¦Àí¡£Ïȸ½ÉÏ´úÂ룺
package crazypebble.reflectiontest; import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class LoadMethodEx { /**
* ÔÚÔËÐÐʱ¼ÓÔØÖ¸¶¨µÄÀ࣬²¢µ÷ÓÃÖ¸¶¨µÄ·½·¨
* @param cName JavaµÄÀàÃû
* @param MethodName ·½·¨Ãû
* @param params ·½·¨µÄ²ÎÊýÖµ
* @return
*/
public Object Load(String cName, String MethodName,
Object[] params) {
Object retObject = null;
try {
// ¼ÓÔØÖ¸¶¨µÄÀà
Class cls = Class.forName(cName); // »ñÈ¡ClassÀàµÄ¶ÔÏóµÄ·½·¨Ö®¶þ
// ÀûÓÃnewInstance()·½·¨£¬»ñÈ¡¹¹Ôì·½·¨µÄʵÀý
// ClassµÄnewInstance·½·¨Ö»ÌṩĬÈÏÎ޲ι¹ÔìʵÀý
// ConstructorµÄnewInstance·½·¨Ìṩ´ø²ÎµÄ¹¹ÔìʵÀý
Constructor ct = cls.getConstructor(null);
Object obj = ct.newInstance(null);
//Object obj = cls.newInstance(); // ¸ù¾Ý·½·¨Ãû»ñȡָ¶¨·½·¨µÄ²ÎÊýÀàÐÍÁбí
Class paramTypes[] = this.getParamTypes(cls,
MethodName);
// »ñȡָ¶¨·½·¨
Method meth = cls.getMethod(MethodName, paramTypes);
meth.setAccessible(true);
// µ÷ÓÃÖ¸¶¨µÄ·½·¨²¢»ñÈ¡·µ»ØÖµÎªObjectÀàÐÍ
retObject = meth.invoke(obj, params);
} catch (Exception e) {
System.err.println(e);
}
return retObject;
}
/**
* »ñÈ¡²ÎÊýÀàÐÍ£¬·µ»ØÖµ±£´æÔÚClass[]ÖÐ
*/
public Class[] getParamTypes (Class cls, String
mName) {
Class[] cs = null;
/*
* Note: ÓÉÓÚÎÒÃÇÒ»°ãͨ¹ý·´Éä»úÖÆµ÷Óõķ½·¨£¬ÊÇ·Çpublic·½·¨
* ËùÒÔÔÚ´Ë´¦Ê¹ÓÃÁËgetDeclaredMethods()·½·¨
*/
Method[] mtd = cls.getDeclaredMethods();
for (int i = 0; i < mtd.length; i++) {
if (!mtd[i].getName().equals(mName)) { // ²»ÊÇÎÒÃÇÐèÒªµÄ²ÎÊý£¬Ôò½øÈëÏÂÒ»´ÎÑ»·
continue;
}
cs = mtd[i].getParameterTypes();
}
return cs;
}
} |
ÎÒÃÇͨ¹ýÇ°Ãæ¼¸½ÚµÄһϵÁзÖÎö£¬Ö»ÒªÎÒÃÇÖªµÀÁËÒ»¸öÀàµÄÀàÃû£¨°üÀ¨Æä°üµÄ·¾¶£©£¬ÄÇÎÒÃǾͿÉÒÔͨ¹ýClassÀàµÄһϵÁз½·¨£¬µÃµ½¸ÃÀàµÄ³ÉÔ±±äÁ¿¡¢¹¹Ôì·½·¨¡¢³ÉÔ±·½·¨¡¢ÒÔ¼°³ÉÔ±·½·¨µÄ²ÎÊýÀàÐͺͷµ»ØÀàÐÍ¡¢»¹ÓÐÐÞÊÎÓòµÈÐÅÏ¢¡£
Èç¹ûÎÒÃÇÒѾ֪µÀij¸öÀàÃûºÍÐèÒª¶¯Ì¬µ÷Óõķ½·¨Ãû£¬ÔõÑù²ÅÄܲ»Óô«Èë·½·¨µÄ²ÎÊýÀàÐ;ͿÉÒÔµ÷Óø÷½·¨ÄØ£¿
ÔÚÒÑÖªÀàÃûµÄÇé¿öÏ£¬ÎÒÃÇ¿ÉÒÔ´òÓ¡Êä³ö¸ÃÀàµÄËùÓÐÐÅÏ¢£¬µ±È»°üÀ¨ÀàµÄ³ÉÔ±·½·¨£»È»ºóͨ¹ý¸ø¶¨µÄ·½·¨Ãû£¬¶Ô´òÓ¡Êä³öµÄ·½·¨Ãû½øÐÐɸѡ£¬ÕÒµ½ÎÒÃÇÐèÒªµÄ·½·¨£»ÔÙͨ¹ý¸Ã·½·¨µÄMethod¶ÔÏ󣬵õ½¸Ã·½·¨µÄ²ÎÊýÀàÐÍ¡¢²ÎÊýÊýÁ¿¡¢ºÍ·µ»ØÀàÐÍ¡£ÄÇôÎÒÃÇÔÚÍⲿ¶¯Ì¬µ÷Óø÷½·¨Ê±£¬¾Í²»ÐèÒª¹ØÐĸÃÀàÐèÒª´«ÈëµÄ²ÎÊýÀàÐÍÁË£¬Ö»ÐèÒª´«ÈëÀàÃû¡¢·½·¨Ãû¡¢²ÎÊýÖµµÄÐÅÏ¢¼´¿É¡£±ÊÕßʵÏÖÁËÒ»¸öÀàLoadMethodEx£¬ÏÈ´ÓÁ½¸öÀàµÄͬһ¸ö·½·¨ÐèÒªµÄ²ÎÊý·½Ãæ×öÒ»¸ö¶Ô±È£º


1¡¢LoadMethodExÀ࣬ÉÙÁËÒ»¸ö²ÎÊý£¨·½·¨²ÎÊýÀàÐÍÁÐ±í£©£¬±¾ÎÄÖ±½Ó´ÓÀàLoadMethodÄÚ²¿»ñÈ¡¸Ã²ÎÊýÀàÐÍÁÐ±í£¬²»ÐèÒªÓû§´«Èë¸ÃÐÅÏ¢£¬ºÃ´¦ÆäʵҲ²»ÑÔ¶øÓ÷ÁË¡£
2¡¢·½·¨µÄ²ÎÊýÖµ£ºÀàLoadMethodÊǽ«ËùÓеķ½·¨²ÎÊý¶¼×öΪһ¸öStringÀ´´«È룬ÔÚ´«ÈëÔÙ½øÐнâÎö£»¶ø±¾ÎÄÔòÖ±½ÓʹÓÃObjectÀàÐÍ×öΪ²ÎÊýÀàÐÍ£¬ÒòΪinvoke(Object
obj, Object...args)·½·¨±¾ÉíËùÐèÒªµÄ²ÎÊýÀàÐ;ÍÊÇObject£¬±ÜÃâÁ˲»±ØÒªµÄ²ÎÊýÀàÐͱ任¡£
ÔÚµ÷ÓÃLoadMethodµÄLoad()·½·¨Ê±£¬Óû§Ö»ÐèÒªÖªµÀÀàÃû¡¢·½·¨Ãû£¬²¢ÇÒ½«ÒѾ³õʼ»¯µÄ²ÎÊýÏÈÏòÉÏתÐÍΪObject£¬È»ºó´«µÝ¸øLoad()·½·¨¼´¿É¡£·½·¨µÄ·µ»ØÖµÎªObject£¬Õâ¸ö¿Ï¶¨ÊÇÓÉÓû§¸ù¾Ý×Ô¼ºµÄÐèÒª£¬ÔÙת»»³É×Ô¼ºËùÐèµÄÀàÐÍ¡£
public ÊôÐÔ
public class java.lang.Integer : bInteger =
4
public class java.lang.String : strB = crazypebble
public & ·Çpublic ÊôÐÔ
private int : bInt = 0
public class java.lang.Integer : bInteger =
4
public class java.lang.String : strB = crazypebble
private class java.lang.String : strA ¹¹Ôì·½·¨£º
public crazypebble.reflectiontest.ReflectionTest()
protected crazypebble.reflectiontest.ReflectionTest(int,
java.lang.String) ¸¸Àà/½Ó¿Ú£º
¸¸Àà: java.lang.Object
½Ó¿Ú0: java.awt.event.ActionListener
½Ó¿Ú1: java.io.Serializable ³ÉÔ±·½·¨£º
public int abc(int, java.lang.String)
public void actionPerformed( java.awt.event.ActionEvent )
public final native void wait(long)
public final void wait()
public final void wait(long, int)
public boolean equals(java.lang.Object)
public java.lang.String toString()
public native int hashCode()
public final native java.lang.Class getClass()
public final native void notify()
public final native void notifyAll() ·´Éä»úÖÆµ÷Ó÷½·¨:LoadMethod
crazypebble ---> 1-hello, android-1! ·´Éä»úÖÆµ÷Ó÷½·¨:LoadMethodEx
crazypebble ---> 2-hello, android-2?
·µ»Ø½á¹û£º0 |
Æß¡¢×ܽá
¹ØÓÚ·´Éä»úÖÆ£¬Æäʵ»¹ÓÐÒ»¸ö±È½ÏÃô¸ÐµÄ»°Ì⣬¾ÍÊÇ·´Éä»úÖÆ´øÀ´ÎÒÃǵݲȫÐÔÎÊÌâ¡£ÓÉÓÚÎÒÔÚÕâ·½ÃæÑо¿µÄ²»ÊǺÜÉîÈ룬ËùÒÔ½²²»ºÃ¡£ ³ÌÐòʵÏÖµÄÔ´Â룺
package crazypebble.androidreflection; import java.lang.reflect.Field; import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; public class MainActivity extends Activity
{
/** Called when the activity is first created.
*/
private static Button btnHandler = null;
private static Button btnShowing = null;
AlertDialog alertDialog = null;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnHandler = (Button)findViewById( R.id.btn_mHandler);
btnHandler.setOnClickListener(new ButtonListener());
btnShowing = (Button)findViewById( R.id.btn_mShowing);
btnShowing.setOnClickListener( new ButtonListener());
alertDialog = new AlertDialog.Builder(this)
.setTitle("abc")
.setMessage("Content")
.setIcon(R.drawable.icon)
.setPositiveButton("È·¶¨", new PositiveClickListener())
.setNegativeButton("È¡Ïû", new NegativeClickListener())
.create();
}
private class ButtonListener implements OnClickListener
{ @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_mHandler:
modify_mHandler();
alertDialog.show();
break;
case R.id.btn_mShowing:
alertDialog.show();
break;
default:
break;
}
}
}
private class PositiveClickListener implements
android.content.DialogInterface .OnClickListener
{ @Override
public void onClick( DialogInterface dialog,
int which ) {
// ·½·¨¶þʱÆôÓÃ
modify_dismissDialog(false);
}
}
private class NegativeClickListener implements
android.content.DialogInterface.OnClickListener
{ @Override
public void onClick( DialogInterface dialog,
int which ) {
// ·½·¨Ò»Ê±ÆôÓÃ
//dialog.dismiss(); // ·½·¨¶þʱÆôÓÃ
modify_dismissDialog(true);
}
}
/*
* µÚÒ»ÖÖ·½·¨£ºÐÞ¸ÄAlertControllerÀàµÄprivate³ÉÔ±±äÁ¿mHandlerµÄÖµ
*/
public void modify_mHandler() {
try {
Field field = alertDialog.getClass( ).getDeclaredField("mAlert");
field.setAccessible(true);
// »ñÈ¡mAlert±äÁ¿µÄÖµ
Object obj = field.get(alertDialog);
field = obj.getClass().getDeclaredField("mHandler");
field.setAccessible(true);
// ÐÞ¸ÄmHandler±äÁ¿µÄÖµ£¬Ê¹ÓÃеÄButtonHandlerÀà
field.set(obj, new MyButtonHandler(alertDialog));
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* µÚ¶þÖÖ·½·¨£ºÐÞ¸ÄdismissDialog()·½·¨
*/
public void modify_dismissDialog(boolean flag)
{
try {
Field field = alertDialog.getClass( ).getSuperclass(
).getDeclaredField("mShowing");
field.setAccessible(true);
// ½«mShowing±äÁ¿ÉèΪfalse£¬±íʾ¶Ô»°¿òÒѾ¹Ø±Õ
field.set(alertDialog, flag);
alertDialog.dismiss();
} catch (Exception e) {
e.printStackTrace();
}
}
} |
package crazypebble.androidreflection; import java.lang.ref.WeakReference; import android.content.DialogInterface;
import android.os.Handler;
import android.os.Message; public class MyButtonHandler extends Handler{ // Button clicks have Message.what as the
BUTTON{1,2,3} constant
private static final int MSG_DISMISS_DIALOG
= 1;
private WeakReference<DialogInterface>
mDialog; public MyButtonHandler( DialogInterface dialog)
{
mDialog = new WeakReference <DialogInterface>(dialog);
} @Override
public void handleMessage( Message msg) {
switch (msg.what) {
case DialogInterface.BUTTON_POSITIVE:
case DialogInterface.BUTTON_NEGATIVE:
case DialogInterface.BUTTON_NEUTRAL:
((DialogInterface.OnClickListener) msg.obj).onClick(mDialog.get(),
msg.what);
break;
}
}
} |
¿´ÍêÉÏÃæÕâÆªÎÄÕÂÖ®ºó£¬Ï£Íû´ó¼ÒÃ÷È·Ò»µãµÄÊÇ£º·´Éä»úÖÆÍ¨¹ývoid setAccessible(boolean
flag)·½·¨¿ÉÒԵõ½Ò»¸öÀàµÄprivateµÄ·½·¨ºÍÊôÐÔ£¬Ê¹ÓÃÕâЩprivateµÄ·½·¨ºÍÊôÐÔ£¬ÒѾ¿ÉÒÔ×öһЩ³¬Ô½ÏÞÖÆµÄÊÂÇéÁË¡£ËùÒÔÔÚʹÓùý³Ì£¬»¹Ðè½÷É÷°¡£¡
|