1.JAVA åå°
2.Unity3d中的反射C# 进阶语法 反射与特性(上)
3.c++反射----使用clang实现
4.反射有什么作用
JAVA åå°
åå°çæ¦å¿µæ¯ç±Smithå¨å¹´é¦æ¬¡æåºçï¼ä¸»è¦æ¯æç¨åºå¯ä»¥è®¿é®ãæ£æµåä¿®æ¹å®æ¬èº«ç¶ææè¡ä¸ºçä¸ç§è½åãè¿ä¸æ¦å¿µçæåºå¾å¿«å¼åäºè®¡ç®æºç§å¦é¢åå ³äºåºç¨åå°æ§çç 究ãå®é¦å 被ç¨åºè¯è¨ç设计é¢åæéç¨,并å¨Lispåé¢å对象æ¹é¢åå¾äºæ绩ãå ¶ä¸LEAD/LEAD++ ãOpenC++ ãMetaXaåOpenJavaçå°±æ¯åºäºåå°æºå¶çè¯è¨ãæè¿ï¼åå°æºå¶ä¹è¢«åºç¨å°äºè§çªç³»ç»ãæä½ç³»ç»åæ件系ç»ä¸ã
åå°æ¬èº«å¹¶ä¸æ¯ä¸ä¸ªæ°æ¦å¿µï¼å®å¯è½ä¼ä½¿æ们èæ³å°å å¦ä¸çåå°æ¦å¿µï¼å°½ç®¡è®¡ç®æºç§å¦èµäºäºåå°æ¦å¿µæ°çå«ä¹ï¼ä½æ¯ï¼ä»ç°è±¡ä¸æ¥è¯´ï¼å®ä»¬ç¡®å®ææäºç¸éä¹å¤ï¼è¿äºæå©äºæ们çç解ãå¨è®¡ç®æºç§å¦é¢åï¼åå°æ¯æä¸ç±»åºç¨ï¼å®ä»¬è½å¤èªæè¿°åèªæ§å¶ãä¹å°±æ¯è¯´ï¼è¿ç±»åºç¨éè¿éç¨æç§æºå¶æ¥å®ç°å¯¹èªå·±è¡ä¸ºçæè¿°ï¼self-representationï¼åçæµï¼examinationï¼ï¼å¹¶è½æ ¹æ®èªèº«è¡ä¸ºçç¶æåç»æï¼è°æ´æä¿®æ¹åºç¨ææè¿°è¡ä¸ºçç¶æåç¸å ³çè¯ä¹ãå¯ä»¥çåºï¼åä¸è¬çåå°æ¦å¿µç¸æ¯ï¼è®¡ç®æºç§å¦é¢åçåå°ä¸ååæåå°æ¬èº«ï¼è¿å æ¬å¯¹åå°ç»ææéåçæªæ½ãææéç¨åå°æºå¶çç³»ç»ï¼å³åå°ç³»ç»ï¼é½å¸æ使系ç»çå®ç°æ´å¼æ¾ãå¯ä»¥è¯´ï¼å®ç°äºåå°æºå¶çç³»ç»é½å ·æå¼æ¾æ§ï¼ä½å ·æå¼æ¾æ§çç³»ç»å¹¶ä¸ä¸å®éç¨äºåå°æºå¶ï¼å¼æ¾æ§æ¯åå°ç³»ç»çå¿ è¦æ¡ä»¶ãä¸è¬æ¥è¯´ï¼åå°ç³»ç»é¤äºæ»¡è¶³å¼æ¾æ§æ¡ä»¶å¤è¿å¿ 须满足åå è¿æ¥ï¼Causally-connectedï¼ãæè°åå è¿æ¥æ¯æ对åå°ç³»ç»èªæè¿°çæ¹åè½å¤ç«å³åæ å°ç³»ç»åºå±çå®é ç¶æåè¡ä¸ºä¸çæ åµï¼åä¹äº¦ç¶ãå¼æ¾æ§ååå è¿æ¥æ¯åå°ç³»ç»ç两大åºæ¬è¦ç´ ã
Javaä¸ï¼åå°æ¯ä¸ç§å¼ºå¤§çå·¥å ·ãå®ä½¿æ¨è½å¤å建çµæ´»ç代ç ï¼è¿äºä»£ç å¯ä»¥å¨è¿è¡æ¶è£ é ï¼æ éå¨ç»ä»¶ä¹é´è¿è¡æºä»£è¡¨é¾æ¥ãåå°å 许æ们å¨ç¼åä¸æ§è¡æ¶ï¼ä½¿æ们çç¨åºä»£ç è½å¤æ¥å ¥è£ è½½å°JVMä¸çç±»çå é¨ä¿¡æ¯ï¼èä¸æ¯æºä»£ç ä¸éå®çç±»åä½ç代ç ãè¿ä½¿åå°æ为æ建çµæ´»çåºç¨ç主è¦å·¥å ·ãä½é注æçæ¯ï¼å¦æ使ç¨ä¸å½ï¼åå°çææ¬å¾é«ã
äºãJavaä¸çç±»åå°ï¼
Reflection æ¯ Java ç¨åºå¼åè¯è¨çç¹å¾ä¹ä¸ï¼å®å 许è¿è¡ä¸ç Java ç¨åºå¯¹èªèº«è¿è¡æ£æ¥ï¼æè 说âèªå®¡âï¼å¹¶è½ç´æ¥æä½ç¨åºçå é¨å±æ§ãJava çè¿ä¸è½åå¨å®é åºç¨ä¸ä¹è®¸ç¨å¾ä¸æ¯å¾å¤ï¼ä½æ¯å¨å ¶å®çç¨åºè®¾è®¡è¯è¨ä¸æ ¹æ¬å°±ä¸åå¨è¿ä¸ç¹æ§ãä¾å¦ï¼PascalãC æè C++ ä¸å°±æ²¡æåæ³å¨ç¨åºä¸è·å¾å½æ°å®ä¹ç¸å ³çä¿¡æ¯ã
1ï¼æ£æµç±»ï¼
1.1 reflectionçå·¥ä½æºå¶
èèä¸é¢è¿ä¸ªç®åçä¾åï¼è®©æ们çç reflection æ¯å¦ä½å·¥ä½çã
import java.lang.reflect.*;
public class DumpMethods {
public static void main(String args[]) {
try {
Class c = Class.forName(args[0]);
Method m[] = c.getDeclaredMethods();
for (int i = 0; i < m.length; i++)
System.out.println(m[i].toString());
} catch (Throwable e) {
System.err.println(e);
}
}
}
æå¦ä¸è¯å¥æ§è¡ï¼
java DumpMethods java.util.Stack
å®çç»æè¾åºä¸ºï¼
public java.lang.Object java.util.Stack.push(java.lang.Object)
public synchronized java.lang.Object java.util.Stack.pop()
public synchronized java.lang.Object java.util.Stack.peek()
public boolean java.util.Stack.empty()
public synchronized int java.util.Stack.search(java.lang.Object)
è¿æ ·å°±ååºäºjava.util.Stack ç±»çåæ¹æ³å以åå®ä»¬çéå¶ç¬¦åè¿åç±»åã
è¿ä¸ªç¨åºä½¿ç¨ Class.forName è½½å ¥æå®çç±»ï¼ç¶åè°ç¨ getDeclaredMethods æ¥è·åè¿ä¸ªç±»ä¸å®ä¹äºçæ¹æ³å表ãjava.lang.reflect.Methods æ¯ç¨æ¥æè¿°æ个类ä¸å个æ¹æ³çä¸ä¸ªç±»ã
1.2 Javaç±»åå°ä¸ç主è¦æ¹æ³
对äºä»¥ä¸ä¸ç±»ç»ä»¶ä¸çä»»ä½ä¸ç±»æ¥è¯´ -- æé å½æ°ãå段åæ¹æ³ -- java.lang.Class æä¾åç§ç¬ç«çåå°è°ç¨ï¼ä»¥ä¸åçæ¹å¼æ¥è·å¾ä¿¡æ¯ãè°ç¨é½éµå¾ªä¸ç§æ åæ ¼å¼ã以ä¸æ¯ç¨äºæ¥æ¾æé å½æ°çä¸ç»åå°è°ç¨ï¼
l Constructor getConstructor(Class[] params) -- è·å¾ä½¿ç¨ç¹æ®çåæ°ç±»åçå ¬å ±æé å½æ°ï¼
l Constructor[] getConstructors() -- è·å¾ç±»çææå ¬å ±æé å½æ°
l Constructor getDeclaredConstructor(Class[] params) -- è·å¾ä½¿ç¨ç¹å®åæ°ç±»åçæé å½æ°(ä¸æ¥å ¥çº§å«æ å ³)
l Constructor[] getDeclaredConstructors() -- è·å¾ç±»çæææé å½æ°(ä¸æ¥å ¥çº§å«æ å ³)
è·å¾å段信æ¯çClass åå°è°ç¨ä¸åäºé£äºç¨äºæ¥å ¥æé å½æ°çè°ç¨ï¼å¨åæ°ç±»åæ°ç»ä¸ä½¿ç¨äºå段åï¼
l Field getField(String name) -- è·å¾å½åçå ¬å ±å段
l Field[] getFields() -- è·å¾ç±»çææå ¬å ±å段
l Field getDeclaredField(String name) -- è·å¾ç±»å£°æçå½åçå段
l Field[] getDeclaredFields() -- è·å¾ç±»å£°æçææå段
ç¨äºè·å¾æ¹æ³ä¿¡æ¯å½æ°ï¼
l Method getMethod(String name, Class[] params) -- 使ç¨ç¹å®çåæ°ç±»åï¼è·å¾å½åçå ¬å ±æ¹æ³
l Method[] getMethods() -- è·å¾ç±»çææå ¬å ±æ¹æ³
l Method getDeclaredMethod(String name, Class[] params) -- 使ç¨ç¹åçåæ°ç±»åï¼è·å¾ç±»å£°æçå½åçæ¹æ³
l Method[] getDeclaredMethods() -- è·å¾ç±»å£°æçæææ¹æ³
1.3å¼å§ä½¿ç¨ Reflectionï¼
ç¨äº reflection çç±»ï¼å¦ Methodï¼å¯ä»¥å¨ java.lang.relfect å ä¸æ¾å°ã使ç¨è¿äºç±»çæ¶åå¿ é¡»è¦éµå¾ªä¸ä¸ªæ¥éª¤ï¼ç¬¬ä¸æ¥æ¯è·å¾ä½ æ³æä½çç±»ç java.lang.Class 对象ãå¨è¿è¡ä¸ç Java ç¨åºä¸ï¼ç¨ java.lang.Class ç±»æ¥æè¿°ç±»åæ¥å£çã
ä¸é¢å°±æ¯è·å¾ä¸ä¸ª Class 对象çæ¹æ³ä¹ä¸ï¼
Class c = Class.forName("java.lang.String");
è¿æ¡è¯å¥å¾å°ä¸ä¸ª String ç±»ç类对象ãè¿æå¦ä¸ç§æ¹æ³ï¼å¦ä¸é¢çè¯å¥ï¼
Class c = int.class;
æè
Class c = Integer.TYPE;
å®ä»¬å¯è·å¾åºæ¬ç±»åç类信æ¯ãå ¶ä¸åä¸ç§æ¹æ³ä¸è®¿é®çæ¯åºæ¬ç±»åçå°è£ ç±» (å¦ Integer) ä¸é¢å å®ä¹å¥½ç TYPE å段ã
第äºæ¥æ¯è°ç¨è¯¸å¦ getDeclaredMethods çæ¹æ³ï¼ä»¥åå¾è¯¥ç±»ä¸å®ä¹çæææ¹æ³çå表ã
ä¸æ¦åå¾è¿ä¸ªä¿¡æ¯ï¼å°±å¯ä»¥è¿è¡ç¬¬ä¸æ¥äºââä½¿ç¨ reflection API æ¥æä½è¿äºä¿¡æ¯ï¼å¦ä¸é¢è¿æ®µä»£ç ï¼
Class c = Class.forName("java.lang.String");
Method m[] = c.getDeclaredMethods();
System.out.println(m[0].toString());
å®å°ä»¥ææ¬æ¹å¼æå°åº String ä¸å®ä¹ç第ä¸ä¸ªæ¹æ³çååã
2ï¼å¤ç对象ï¼
å¦æè¦ä½ä¸ä¸ªå¼åå·¥å ·ådebuggerä¹ç±»çï¼ä½ å¿ é¡»è½åç°filed values,以ä¸æ¯ä¸ä¸ªæ¥éª¤:
a.å建ä¸ä¸ªClass对象
b.éè¿getField å建ä¸ä¸ªField对象
c.è°ç¨Field.getXXX(Object)æ¹æ³(XXXæ¯Int,Floatçï¼å¦ææ¯å¯¹è±¡å°±çç¥ï¼Objectæ¯æå®ä¾).
ä¾å¦ï¼
import java.lang.reflect.*;
import java.awt.*;
class SampleGet {
public static void main(String[] args) {
Rectangle r = new Rectangle(, );
printHeight(r);
}
static void printHeight(Rectangle r) {
Field heightField;
Integer heightValue;
Class c = r.getClass();
try {
heightField = c.getField("height");
heightValue = (Integer) heightField.get(r);
System.out.println("Height: " + heightValue.toString());
} catch (NoSuchFieldException e) {
System.out.println(e);
} catch (SecurityException e) {
System.out.println(e);
} catch (IllegalAccessException e) {
System.out.println(e);
}
}
}
ä¸ãå®å ¨æ§ååå°ï¼
å¨å¤çåå°æ¶å®å ¨æ§æ¯ä¸ä¸ªè¾å¤æçé®é¢ãåå°ç»å¸¸ç±æ¡æ¶å代ç 使ç¨ï¼ç±äºè¿ä¸ç¹ï¼æ们å¯è½å¸ææ¡æ¶è½å¤å ¨é¢æ¥å ¥ä»£ç ï¼æ éèè常è§çæ¥å ¥éå¶ãä½æ¯ï¼å¨å ¶å®æ åµä¸ï¼ä¸åæ§å¶çæ¥å ¥ä¼å¸¦æ¥ä¸¥éçå®å ¨æ§é£é©ï¼ä¾å¦å½ä»£ç å¨ä¸å¼å¾ä¿¡ä»»ç代ç å ±äº«çç¯å¢ä¸è¿è¡æ¶ã
ç±äºè¿äºäºç¸çç¾çéæ±ï¼Javaç¼ç¨è¯è¨å®ä¹ä¸ç§å¤çº§å«æ¹æ³æ¥å¤çåå°çå®å ¨æ§ãåºæ¬æ¨¡å¼æ¯å¯¹åå°å®æ½ä¸åºç¨äºæºä»£ç æ¥å ¥ç¸åçéå¶ï¼
n ä»ä»»æä½ç½®å°ç±»å ¬å ±ç»ä»¶çæ¥å ¥
n ç±»èªèº«å¤é¨æ ä»»ä½å°ç§æç»ä»¶çæ¥å ¥
n åä¿æ¤åæå ï¼ç¼ºçæ¥å ¥ï¼ç»ä»¶çæéæ¥å ¥
ä¸è¿è³å°æäºæ¶åï¼å´ç»è¿äºéå¶è¿æä¸ç§ç®åçæ¹æ³ãæ们å¯ä»¥å¨æ们æåçç±»ä¸ï¼æ©å±ä¸ä¸ªæ®éçåºæ¬ç±»java.lang.reflect.AccessibleObject ç±»ãè¿ä¸ªç±»å®ä¹äºä¸ç§setAccessibleæ¹æ³ï¼ä½¿æ们è½å¤å¯å¨æå ³é对è¿äºç±»ä¸å ¶ä¸ä¸ä¸ªç±»çå®ä¾çæ¥å ¥æ£æµãå¯ä¸çé®é¢å¨äºå¦æ使ç¨äºå®å ¨æ§ç®¡çå¨ï¼å®å°æ£æµæ£å¨å ³éæ¥å ¥æ£æµç代ç æ¯å¦è®¸å¯äºè¿æ ·åãå¦ææªè®¸å¯ï¼å®å ¨æ§ç®¡çå¨æåºä¸ä¸ªä¾å¤ã
ä¸é¢æ¯ä¸æ®µç¨åºï¼å¨TwoString ç±»çä¸ä¸ªå®ä¾ä¸ä½¿ç¨åå°æ¥æ¾ç¤ºå®å ¨æ§æ£å¨è¿è¡ï¼
public class ReflectSecurity {
public static void main(String[] args) {
try {
TwoString ts = new TwoString("a", "b");
Field field = clas.getDeclaredField("m_s1");
// field.setAccessible(true);
System.out.println("Retrieved value is " +
field.get(inst));
} catch (Exception ex) {
ex.printStackTrace(System.out);
}
}
}
å¦ææ们ç¼è¯è¿ä¸ç¨åºæ¶ï¼ä¸ä½¿ç¨ä»»ä½ç¹å®åæ°ç´æ¥ä»å½ä»¤è¡è¿è¡ï¼å®å°å¨field .get(inst)è°ç¨ä¸æåºä¸ä¸ªIllegalAccessExceptionå¼å¸¸ãå¦ææ们ä¸æ³¨éfield.setAccessible(true)代ç è¡ï¼é£ä¹éæ°ç¼è¯å¹¶éæ°è¿è¡è¯¥ä»£ç ï¼å®å°ç¼è¯æåãæåï¼å¦ææ们å¨å½ä»¤è¡æ·»å äºJVMåæ°-Djava.security.manager以å®ç°å®å ¨æ§ç®¡çå¨ï¼å®ä»ç¶å°ä¸è½éè¿ç¼è¯ï¼é¤éæ们å®ä¹äºReflectSecurityç±»ç许å¯æéã
åãåå°æ§è½ï¼
åå°æ¯ä¸ç§å¼ºå¤§çå·¥å ·ï¼ä½ä¹åå¨ä¸äºä¸è¶³ãä¸ä¸ªä¸»è¦ç缺ç¹æ¯å¯¹æ§è½æå½±åã使ç¨åå°åºæ¬ä¸æ¯ä¸ç§è§£éæä½ï¼æ们å¯ä»¥åè¯JVMï¼æ们å¸æåä»ä¹å¹¶ä¸å®æ»¡è¶³æ们çè¦æ±ãè¿ç±»æä½æ»æ¯æ ¢äºåªç´æ¥æ§è¡ç¸åçæä½ã
ä¸é¢çç¨åºæ¯å段æ¥å ¥æ§è½æµè¯çä¸ä¸ªä¾åï¼å æ¬åºæ¬çæµè¯æ¹æ³ãæ¯ç§æ¹æ³æµè¯å段æ¥å ¥çä¸ç§å½¢å¼ -- accessSame ä¸åä¸å¯¹è±¡çæåå段åä½ï¼accessOther 使ç¨å¯ç´æ¥æ¥å ¥çå¦ä¸å¯¹è±¡çå段ï¼accessReflection 使ç¨å¯éè¿åå°æ¥å ¥çå¦ä¸å¯¹è±¡çå段ãå¨æ¯ç§æ åµä¸ï¼æ¹æ³æ§è¡ç¸åçè®¡ç® -- 循ç¯ä¸ç®åçå /ä¹é¡ºåºã
ç¨åºå¦ä¸ï¼
public int accessSame(int loops) {
m_value = 0;
for (int index = 0; index < loops; index++) {
m_value = (m_value + ADDITIVE_VALUE)
*MULTIPLIER_VALUE;
}
return m_value;
}
public int accessReference(int loops) {
TimingClass timing = new TimingClass();
for (int index = 0; index < loops; index++) {
timing.m_value = (timing.m_value + ADDITIVE_VALUE)
*MULTIPLIER_VALUE;
}
return timing.m_value;
}
public int accessReflection(int loops) throws Exception {
TimingClass timing = new TimingClass();
try {
Field field = TimingClass.class.
getDeclaredField("m_value");
for (int index = 0; index < loops; index++) {
int value = (field.getInt(timing) +
ADDITIVE_VALUE) * MULTIPLIER_VALUE;
field.setInt(timing, value);
}
return timing.m_value;
} catch (Exception ex) {
System.out.println("Error using reflection");
throw ex;
}
}
å¨ä¸é¢çä¾åä¸ï¼æµè¯ç¨åºéå¤è°ç¨æ¯ç§æ¹æ³ï¼ä½¿ç¨ä¸ä¸ªå¤§å¾ªç¯æ°ï¼ä»èå¹³åå¤æ¬¡è°ç¨çæ¶é´è¡¡éç»æãå¹³åå¼ä¸ä¸å æ¬æ¯ç§æ¹æ³ç¬¬ä¸æ¬¡è°ç¨çæ¶é´ï¼å æ¤åå§åæ¶é´ä¸æ¯ç»æä¸çä¸ä¸ªå ç´ ãä¸é¢çå¾æ¸ æ¥çåæ们å±ç¤ºäºæ¯ç§æ¹æ³å段æ¥å ¥çæ¶é´ï¼
å¾ 1ï¼å段æ¥å ¥æ¶é´ ï¼
æ们å¯ä»¥çåºï¼å¨å两å¯å¾ä¸(Sun JVM)ï¼ä½¿ç¨åå°çæ§è¡æ¶é´è¶ è¿ä½¿ç¨ç´æ¥æ¥å ¥çå以ä¸ãéè¿æ¯è¾ï¼IBM JVMå¯è½ç¨å¥½ä¸äºï¼ä½åå°æ¹æ³ä»æ§éè¦æ¯å ¶å®æ¹æ³é¿å以ä¸çæ¶é´ãä»»ä½JVMä¸å ¶å®ä¸¤ç§æ¹æ³ä¹é´æ¶é´æ¹é¢æ ä»»ä½æ¾èå·®å¼ï¼ä½IBM JVMå ä¹æ¯Sun JVMå¿«ä¸åãææå¯è½çæ¯è¿ç§å·®å¼åæ äºSun Hot Spot JVMçä¸ä¸ä¼åï¼å®å¨ç®ååºåæ¹é¢è¡¨ç°å¾å¾ç³ç³ãåå°æ§è½æ¯Sunå¼å1.4 JVMæ¶å ³æ³¨çä¸ä¸ªæ¹é¢ï¼å®å¨åå°æ¹æ³è°ç¨ç»æä¸æ¾ç¤ºãå¨è¿ç±»æä½çæ§è½æ¹é¢ï¼Sun 1.4.1 JVMæ¾ç¤ºäºæ¯1.3.1çæ¬å¾å¤§çæ¹è¿ã
å¦æ为为å建使ç¨åå°ç对象ç¼åäºç±»ä¼¼ç计æ¶æµè¯ç¨åºï¼æ们ä¼åç°è¿ç§æ åµä¸çå·®å¼ä¸è±¡å段åæ¹æ³è°ç¨æ åµä¸é£ä¹æ¾èã使ç¨newInstance()è°ç¨å建ä¸ä¸ªç®åçjava.lang.Objectå®ä¾èç¨çæ¶é´å¤§çº¦æ¯å¨Sun 1.3.1 JVMä¸ä½¿ç¨new Object()çåï¼æ¯å¨IBM 1.4.0 JVMçååï¼åªæ¯Sun 1.4.1 JVMä¸ç两é¨ã使ç¨Array.newInstance(type, size)å建ä¸ä¸ªæ°ç»èç¨çæ¶é´æ¯ä»»ä½æµè¯çJVMä¸ä½¿ç¨new type[size]ç两åï¼éçæ°ç»å¤§å°çå¢å ï¼å·®å¼éæ¥ç¼©å°ã
ç»æè¯ï¼
Javaè¯è¨åå°æä¾ä¸ç§å¨æé¾æ¥ç¨åºç»ä»¶çå¤åè½æ¹æ³ãå®å 许ç¨åºå建åæ§å¶ä»»ä½ç±»ç对象(æ ¹æ®å®å ¨æ§éå¶)ï¼æ éæå硬ç¼ç ç®æ ç±»ãè¿äºç¹æ§ä½¿å¾åå°ç¹å«éç¨äºå建以é常æ®éçæ¹å¼ä¸å¯¹è±¡åä½çåºãä¾å¦ï¼åå°ç»å¸¸å¨æç»åå¨å¯¹è±¡ä¸ºæ°æ®åºãXMLæå ¶å®å¤é¨æ ¼å¼çæ¡æ¶ä¸ä½¿ç¨ãJava reflection é常æç¨ï¼å®ä½¿ç±»åæ°æ®ç»æè½æå称å¨ææ£ç´¢ç¸å ³ä¿¡æ¯ï¼å¹¶å 许å¨è¿è¡ççç¨åºä¸æä½è¿äºä¿¡æ¯ãJava çè¿ä¸ç¹æ§é常强大ï¼å¹¶ä¸æ¯å ¶å®ä¸äºå¸¸ç¨è¯è¨ï¼å¦ CãC++ãFortran æè Pascal çé½ä¸å ·å¤çã
ä½åå°æ两个缺ç¹ã第ä¸ä¸ªæ¯æ§è½é®é¢ãç¨äºå段åæ¹æ³æ¥å ¥æ¶åå°è¦è¿æ ¢äºç´æ¥ä»£ç ãæ§è½é®é¢çç¨åº¦åå³äºç¨åºä¸æ¯å¦ä½ä½¿ç¨åå°çãå¦æå®ä½ä¸ºç¨åºè¿è¡ä¸ç¸å¯¹å¾å°æ¶åçé¨åï¼ç¼æ ¢çæ§è½å°ä¸ä¼æ¯ä¸ä¸ªé®é¢ãå³ä½¿æµè¯ä¸æåæ åµä¸ç计æ¶å¾æ¾ç¤ºçåå°æä½åªèç¨å å¾®ç§ãä» åå°å¨æ§è½å ³é®çåºç¨çæ ¸å¿é»è¾ä¸ä½¿ç¨æ¶æ§è½é®é¢æåå¾è³å ³éè¦ã
许å¤åºç¨ä¸æ´ä¸¥éçä¸ä¸ªç¼ºç¹æ¯ä½¿ç¨åå°ä¼æ¨¡ç³ç¨åºå é¨å®é è¦åççäºæ ãç¨åºäººåå¸æå¨æºä»£ç ä¸çå°ç¨åºçé»è¾ï¼åå°çç»è¿äºæºä»£ç çææ¯ä¼å¸¦æ¥ç»´æ¤é®é¢ãåå°ä»£ç æ¯ç¸åºçç´æ¥ä»£ç æ´å¤æï¼æ£å¦æ§è½æ¯è¾ç代ç å®ä¾ä¸çå°çä¸æ ·ã解å³è¿äºé®é¢çæä½³æ¹æ¡æ¯ä¿å®å°ä½¿ç¨åå°ââä» å¨å®å¯ä»¥çæ£å¢å çµæ´»æ§çå°æ¹ââè®°å½å ¶å¨ç®æ ç±»ä¸ç使ç¨ã
å©ç¨åå°å®ç°ç±»çå¨æå è½½
Bromonåå 请å°éçæ
æè¿å¨æé½åä¸ä¸ªç§»å¨å¢å¼é¡¹ç®ï¼ä¿ºè´è´£åå°server端ãåè½å¾ç®åï¼ææºç¨æ·éè¿GPRSæå¼Socketä¸æå¡å¨è¿æ¥ï¼æåæ ¹æ®ç¨æ·ä¼ è¿æ¥çæ°æ®ååºååºãåè¿ç±»ä¼¼é¡¹ç®çå å¼ä¸å®é½ç¥éï¼é¦å éè¦å®ä¹ä¸ä¸ªç±»ä¼¼äºMSNPçé讯åè®®ï¼ä¸è¿ä»å¤©çè¯é¢æ¯å¦ä½æè¿ä¸ªç³»ç»è®¾è®¡å¾å ·æé«åº¦çæ©å±æ§ãç±äºè¿ä¸ªé¡¹ç®æ¬èº«æ²¡æè¿è¡è¿è¾ä¸ºå®åç客æ·æ²éåéæ±åæï¼æ以以åè¯å®ä¼æå¾å¤åè½ä¸çæ©å±ï¼é讯åè®®è¯å®ä¼è¶æ¥è¶åºå¤§ï¼èæä½ä¸ºä¸ä¸ªä¸é£ä¹å¤å¿«ç人ï¼å½ç¶ä¸æ³ä»¥ååå»ä¿®æ¹å好çç¨åºï¼æ以è¿ä¸ªé¡¹ç®æ¯å®è·µé¢å对象设计ç好æºä¼ã
é¦å å®ä¹ä¸ä¸ªæ¥å£æ¥é离类ï¼
package org.bromon.reflect;
public interface Operator
{
public java.util.List act(java.util.List params)
}
æ ¹æ®è®¾è®¡æ¨¡å¼çåçï¼æ们å¯ä»¥ä¸ºä¸åçåè½ç¼åä¸åçç±»ï¼æ¯ä¸ªç±»é½ç»§æ¿Operatoræ¥å£ï¼å®¢æ·ç«¯åªéè¦é对Operatoræ¥å£ç¼ç¨å°±å¯ä»¥é¿å å¾å¤éº»ç¦ãæ¯å¦è¿ä¸ªç±»ï¼
package org.bromon.reflect.*;
public class Success implements Operator
{
public java.util.List act(java.util.List params)
{
List result=new ArrayList();
Unity3d中的C# 进阶语法 反射与特性(上)
在Unity3d开发中,即使在忙碌的码反码示工作中,我们也要保持学习的射代热情。本文将深入探讨C#的反射进阶概念——反射(Reflection)和特性(Attribute)。
1. 反射与元数据
反射如同程序的码反码示自我描述机制,它允许程序访问和操作其自身的射代mosquitto源码配置结构,如类型、反射成员和属性。码反码示在Unity中,射代.meta文件就像代码的反射元数据描述,如资产的码反码示GUID和文件类型信息。通过反射,射代开发者可以动态获取和操作这些信息,反射比如获取类的码反码示成员变量和方法等。
2. 特性的射代功能与应用
特性是C#中的声明性标签,用来传递元素行为信息,如方法的repetier 源码范围限制、字段的序列化设置和Inspector中的显示标题。例如,Unity中的[Range]、[SerializeField]和[Header]都是特性,它们提供了额外的元数据,帮助开发者更好地管理代码。
3. 反射与特性的实用价值
反射在无法直接查看源码或DLL时,提供了一种获取类信息的方法。比如,它可以帮助开发者在不查看源码的情况下找到私有方法。特性则用于标记过时的方法,如Unity的[Obsolete]特性,确保在使用过时API时得到提示。
4. 如何运用
实践上,开发者可以利用反射来操作MonoBehaviour类,获取其公开方法和属性。vertx源码反射的常见应用包括实例化、创建委托、判断类的继承关系以及获取程序集信息。特性则在处理API版本兼容性问题时大显身手,比如标记旧方法为过时。
掌握反射和特性,不仅能提升代码的灵活性,还能在遇到特殊需求时提供强大的工具支持。后续文章将深入讲解这两个概念的更多实际应用。
c++反射----使用clang实现
LLVM 与 Clang 介绍
LLVM 是 Low Level Virtual Machine 的简称,它提供了一系列与编译器相关的支持,涵盖编译期优化、链接优化、在线编译优化及代码生成。LLVM 可以作为多种语言的后端,如 C、talkback源码C++、Objective-C、Rust、Swift 等。
Clang 是一个基于 LLVM 的 C++ 编写编译器前端,由 Apple 开发,用于在不支持全部 OpenGL 特性的 GPU 上生成代码(JIT),以确保程序的正常运行。Clang 相对于 GCC 具有清晰简单的设计、易于理解与扩展的特性,并提供了易于 IDE 集成的工具,如 clang-format、clang-ast、libclang、libtooling、address sanitizer 等。getconnection 源码
使用 Clang 实现 C++ 反射
Clang 提供了一系列 C 语言接口,用于实现反射功能。尽管这些接口提供了部分基本信息,但不能全面涵盖 Clang C++ AST 中的信息。部分 C 接口虽附有 doxygen 注释,但作为指导文档,其内容不足以覆盖所有实现细节。实现特定功能时,开发者需自行探索。
抽象语法树(AST)解析
抽象语法树(AST)是 Clang 解析源代码生成的形式。通过相关工具导出 AST,可以实现代码分析和自动生成。以代码示例为例,经过手工分析,可以将其解析为 AST 形式。通过 Clang 命令(如 clang -Xclang -ast-dump -fsyntax-only test.hxx)打印 AST 输出,展示代码的抽象结构。
利用 AST Matcher 过滤输出
AST Matcher 可用于筛选 AST dump 的输出,获取特定信息。例如,仅打印参数类型为 std::vector 的函数声明。
反射需求分析
实现反射功能需要获取类、字段、函数等信息。通过 AST Matcher,可以过滤并获取感兴趣的部分。对于特定类、字段、函数的过滤,利用属性(Attribute)功能。
属性(Attribute)介绍
属性是程序结构的元数据,用于向编译器传递语义信息,如代码生成结构或静态分析信息。属性定义方式在不同编译器中有所不同,例如 GNU 和 Microsoft Visual C++ 的属性定义。
自定义属性实现
通过 annotate 属性作为标记,使用宏或其他方法扩展属性定义,实现自定义功能。利用 annotate 属性生成元数据,随后通过模板语言(如 Mustache)自动生成代码。
代码自动生成流程
在反射功能实现后,通过模板语言自动生成代码,构建包含反射信息的元数据。随后,通过预处理器或类似机制,将生成的代码插入原有编译流程中。
总结
利用 Clang 和 libclang 实现 C++ 反射功能,构建了自定义的反射系统。然而,系统存在模板支持不完全、libclang 局限性等问题。对于完整且严谨的反射系统,推荐直接使用 Clang 的 C++ 接口,功能更加强大,但文档相对缺乏。总之,实现 C++ 反射涉及深入理解和使用 Clang 和 libclang 的功能。
反射有什么作用
1、Java语言反射提供一种动态链接程序组件的多功能方法。它允许程序创建和控制任何类的对象(根据安全性限制),无需提前硬编码目标类。这些特性使得反射 特别适用于创建以非常普通的方式与对象协作的库。例如,反射经常在持续存储对象为数据库、XML或其它外部格式的框架中使用。Java reflection 非常有用,它使类和数据结构能按名称动态检索相关信息,并允许在运行着的程序中操作这些信息。Java 的这一特性非常强大,并且是其它一些常用语言,如 C、C++、Fortran 或者 Pascal 等都不具备的。
2、但反射有两个缺点。第一个是性能问题。用于字段和方法接入时反射要远慢于直接代码。性能问题的程度取决于程序中是如何使用反射的。如果它作为程序运行中相 对很少涉及的部分,缓慢的性能将不会是一个问题。即使测试中最坏情况下的计时图显示的反射操作只耗用几微秒。仅反射在性能关键的应用的核心逻辑中使用时性 能问题才变得至关重要。
3、许多应用中更严重的一个缺点是使用反射会模糊程序内部实际要发生的事情。程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术会带来维护问 题。反射代码比相应的直接代码更复杂,正如性能比较的代码实例中看到的一样。解决这些问题的最佳方案是保守地使用反射——仅在它可以真正增加灵活性的地方 ——记录其在目标类中的使用。
2024-11-25 10:21
2024-11-25 10:19
2024-11-25 09:27
2024-11-25 09:07
2024-11-25 08:59
2024-11-25 07:49