一、什么是反射:二、什么是Java中的类反射:三、Java类反射中所必须的类:并且一一例举案例?
ä¸ãä»ä¹æ¯åå°ï¼
åå°çæ¦å¿µæ¯ç±Smithå¨1982å¹´é¦æ¬¡æåºçï¼ä¸»è¦æ¯æç¨åºå¯ä»¥è®¿é®ãæ£æµåä¿®æ¹å®æ¬èº«ç¶ææè¡ä¸ºçä¸ç§è½åãè¿ä¸æ¦å¿µçæåºå¾å¿«å¼åäºè®¡ç®æºç§å¦é¢åå ³äºåºç¨åå°æ§çç 究ãå®é¦å 被ç¨åºè¯è¨ç设计é¢åæéç¨,并å¨Lispåé¢å对象æ¹é¢åå¾äºæ绩ãå ¶ä¸LEAD/LEAD++ ãOpenC++ ãMetaXaåOpenJavaçå°±æ¯åºäºåå°æºå¶çè¯è¨ãæè¿ï¼åå°æºå¶ä¹è¢«åºç¨å°äºè§çªç³»ç»ãæä½ç³»ç»åæ件系ç»ä¸ãåå°æ¬èº«å¹¶ä¸æ¯ä¸ä¸ªæ°æ¦å¿µï¼å°½ç®¡è®¡ç®æºç§å¦èµäºäºåå°æ¦å¿µæ°çå«ä¹ãå¨è®¡ç®æºç§å¦é¢åï¼åå°æ¯æä¸ç±»åºç¨ï¼å®ä»¬è½å¤èªæè¿°åèªæ§å¶ãä¹å°±æ¯è¯´ï¼è¿ç±»åºç¨éè¿éç¨æç§æºå¶æ¥å®ç°å¯¹èªå·±è¡ä¸ºçæè¿°ï¼self-representationï¼åçæµï¼examinationï¼ï¼å¹¶è½æ ¹æ®èªèº«è¡ä¸ºçç¶æåç»æï¼è°æ´æä¿®æ¹åºç¨ææè¿°è¡ä¸ºçç¶æåç¸å ³çè¯ä¹ãäºãä»ä¹æ¯Javaä¸çç±»åå°ï¼
Reflection æ¯ Java ç¨åºå¼åè¯è¨çç¹å¾ä¹ä¸ï¼å®å 许è¿è¡ä¸ç Java ç¨åºå¯¹èªèº«è¿è¡æ£æ¥ï¼æè 说âèªå®¡âï¼å¹¶è½ç´æ¥æä½ç¨åºçå é¨å±æ§åæ¹æ³ãJava çè¿ä¸è½åå¨å®é åºç¨ä¸ç¨å¾ä¸æ¯å¾å¤ï¼ä½æ¯å¨å ¶å®çç¨åºè®¾è®¡è¯è¨ä¸æ ¹æ¬å°±ä¸åå¨è¿ä¸ç¹æ§ãä¾å¦ï¼PascalãC æè C++ ä¸å°±æ²¡æåæ³å¨ç¨åºä¸è·å¾å½æ°å®ä¹ç¸å ³çä¿¡æ¯ã
Reflection æ¯ Java 被è§ä¸ºå¨æï¼æåå¨æï¼è¯è¨çå ³é®ï¼å 许ç¨åºäºæ§è¡æ Reflection APIs åå¾ä»»ä½å·²ç¥åç§°ä¹ class çå é¨ä¿¡æ¯ï¼å æ¬ packageãtype parametersãsuperclassãimplemented interfacesãinner classes, outer class, fieldsãconstructorsãmethodsãmodifiersï¼å¹¶å¯äºæ§è¡æçæinstancesãåæ´ fields å 容æå¤èµ· methodsãä¸ãJavaç±»åå°ä¸æå¿ é¡»çç±»ï¼
Javaçç±»åå°æéè¦ç类并ä¸å¤ï¼å®ä»¬åå«æ¯ï¼FieldãConstructorãMethodãClassãObjectï¼ä¸é¢æå°å¯¹è¿äºç±»åä¸ä¸ªç®åç说æã
Fieldç±»ï¼æä¾æå ³ç±»ææ¥å£çå±æ§çä¿¡æ¯ï¼ä»¥å对å®çå¨æ访é®æéãåå°çå段å¯è½æ¯ä¸ä¸ªç±»ï¼éæï¼å±æ§æå®ä¾å±æ§ï¼ç®åçç解å¯ä»¥æå®çæä¸ä¸ªå°è£ åå°ç±»çå±æ§çç±»ã
Constructorç±»ï¼æä¾å ³äºç±»çå个æé æ¹æ³çä¿¡æ¯ä»¥å对å®ç访é®æéãè¿ä¸ªç±»åFieldç±»ä¸åï¼Fieldç±»å°è£ äºåå°ç±»çå±æ§ï¼èConstructorç±»åå°è£ äºåå°ç±»çæé æ¹æ³ã
Methodç±»ï¼æä¾å ³äºç±»ææ¥å£ä¸åç¬æ个æ¹æ³çä¿¡æ¯ãæåæ çæ¹æ³å¯è½æ¯ç±»æ¹æ³æå®ä¾æ¹æ³ï¼å æ¬æ½è±¡æ¹æ³ï¼ã è¿ä¸ªç±»ä¸é¾ç解ï¼å®æ¯ç¨æ¥å°è£ åå°ç±»æ¹æ³çä¸ä¸ªç±»ã
Classç±»ï¼ç±»çå®ä¾è¡¨ç¤ºæ£å¨è¿è¡ç Java åºç¨ç¨åºä¸çç±»åæ¥å£ãæ举æ¯ä¸ç§ç±»ï¼æ³¨éæ¯ä¸ç§æ¥å£ãæ¯ä¸ªæ°ç»å±äºè¢«æ å°ä¸º Class 对象çä¸ä¸ªç±»ï¼ææå ·æç¸åå ç´ ç±»ååç»´æ°çæ°ç»é½å ±äº«è¯¥ Class 对象ã
Objectç±»ï¼æ¯ä¸ªç±»é½ä½¿ç¨ Object ä½ä¸ºè¶ ç±»ãææ对象ï¼å æ¬æ°ç»ï¼é½å®ç°è¿ä¸ªç±»çæ¹æ³ãåãJavaçåå°ç±»è½åä»ä¹ï¼
çå®ä¸é¢çè¿ä¹å¤ææ³ä½ å·²ç»ä¸èç¦äºï¼ä½ 以为æå¨æµªè´¹ä½ çæ¶é´ï¼é£ä¹å¥½å§ï¼ä¸é¢æ们就ç¨ä¸äºç®åçå°ä¾åæ¥è¯´æå®ã
é¦å æ们æ¥çä¸ä¸éè¿Javaçåå°æºå¶æ们è½å¾å°äºä»ä¹ã
é¦å æ们æ¥åä¸ä¸ªç±»ï¼java 代ç
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
class A extends Object implements ActionListener{
private int a = 3;
public Integer b = new Integer(4);
public A(){}
public A(int id,String name){}
public int abc(int id,String name){return 0;}
public void actionPerformed(ActionEvent e){}
} ä½ å¯è½è¢«æè¿ä¸ªç±»å¼ç³æ¶äºï¼ä½ çä¸åºæè¦åä»ä¹ï¼é£å°±ä¸è¦çè¿ä¸ªç±»äºï¼è¿ä¸ªç±»æ¯ç¨æ¥æµè¯çï¼ä½ ç¥éç¥éå®ç»§æ¿äºObjectç±»ï¼æä¸ä¸ªæ¥å£æ¯ActionListenerï¼ä¸¤ä¸ªå±æ§intåInteger,两个æé æ¹æ³å两个æ¹æ³ï¼è¿å°±è¶³å¤äºã
ä¸é¢æ们æAè¿ä¸ªç±»ä½ä¸ºä¸ä¸ªåå°ç±»ï¼æ¥è¿å»Aç±»ä¸çä¸äºä¿¡æ¯ï¼é¦å æ们å æ¥è¿å»ä¸ä¸åå°ç±»ä¸çå±æ§åå±æ§å¼ãjava 代ç
import java.lang.reflect.*;
class B{
public static void main(String args[]){
A r = new A();
Class temp = r.getClass();
try{
System.out.println("åå°ç±»ä¸ææå ¬æçå±æ§");
Field[] fb =temp.getFields();
for(int j=0;j<fb.length;j++){
Class cl = fb[j].getType();
System.out.println("fb:"+cl);
}
System.out.println("åå°ç±»ä¸ææçå±æ§");
Field[] fa = temp.getDeclaredFields();
for(int j=0;j<fa.length;j++){
Class cl = fa[j].getType();
System.out.println("fa:"+cl);
}
System.out.println("åå°ç±»ä¸ç§æå±æ§çå¼");
Field f = temp.getDeclaredField("a");
f.setAccessible(true);
Integer i = (Integer)f.get(r);
System.out.println(i);
}catch(Exception e){
e.printStackTrace();
}
}
} è¿éç¨å°äºä¸¤ä¸ªæ¹æ³ï¼getFields()ãgetDeclaredFields()ï¼å®ä»¬åå«æ¯ç¨æ¥è·ååå°ç±»ä¸ææå ¬æå±æ§ååå°ç±»ä¸ææçå±æ§çæ¹æ³ãå¦å¤è¿ægetField(String)ågetDeclaredField(String)æ¹æ³é½æ¯ç¨æ¥è¿å»åå°ç±»ä¸æå®çå±æ§çæ¹æ³ï¼è¦æ³¨æçæ¯getFieldæ¹æ³åªè½åå°åå°ç±»ä¸å ¬æçå±æ§ï¼ègetDeclaredFieldæ¹æ³é½è½åå°ã
è¿éè¿ç¨å°äºField ç±»çsetAccessibleæ¹æ³ï¼å®æ¯ç¨æ¥è®¾ç½®æ¯å¦ææé访é®åå°ç±»ä¸çç§æå±æ§çï¼åªæ设置为trueæ¶æå¯ä»¥è®¿é®ï¼é»è®¤ä¸ºfalseãå¦å¤ Fieldç±»è¿æset(Object AttributeName,Object value)æ¹æ³ï¼å¯ä»¥æ¹åæå®å±æ§çå¼ãä¸é¢æ们æ¥çä¸ä¸å¦ä½è·ååå°ç±»ä¸çæé æ¹æ³java 代ç
import java.lang.reflect.*;
public class SampleConstructor {
public static void main(String[] args) {
A r = new A();
printConstructors(r);
}
public static void printConstructors(A r) {
Class c = r.getClass();
//è·åæå®ç±»çç±»å
String className = c.getName();
try {
//è·åæå®ç±»çæé æ¹æ³
Constructor[] theConstructors = c.getConstructors();
for(int i=0; i<theConstructors.length; i++) {
//è·åæå®æé æ¹æ³çåæ°çéå
Class[] parameterTypes = theConstructors[i].getParameterTypes();
System.out.print(className + "(");
for(int j=0; j<parameterTypes.length; j++)
System.out.print(parameterTypes[j].getName() + " ");
System.out.println(")");
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
è¿ä¸ªä¾åå¾ç®å,åªæ¯ç¨getConstructors()æ¹æ³è·åäºåå°ç±»çæé æ¹æ³çéåï¼å¹¶ç¨Constructorç±»çgetParameterTypes()è·å该æé æ¹æ³çåæ°ãä¸é¢æ们åæ¥è·åä¸ä¸åå°ç±»çç¶ç±»ï¼è¶ ç±»ï¼åæ¥å£java 代ç
import java.io.*;
import java.lang.reflect.*;
public class SampleInterface {
public static void main(String[] args) throws Exception {
A raf = new A();
printInterfaceNames(raf);
}
public static void printInterfaceNames(Object o) {
Class c = o.getClass();
//è·ååå°ç±»çæ¥å£
Class[] theInterfaces = c.getInterfaces();
for(int i=0; i<theInterfaces.length; i++)
System.out.println(theInterfaces[i].getName());
//è·ååå°ç±»çç¶ç±»ï¼è¶ ç±»ï¼
Class theSuperclass = c.getSuperclass();
System.out.println(theSuperclass.getName());
}
} è¿ä¸ªä¾åä¹å¾ç®åï¼åªæ¯ç¨Classç±»çgetInterfaces()æ¹æ³è·ååå°ç±»çæææ¥å£ï¼ç±äºæ¥å£å¯ä»¥æå¤ä¸ªï¼æ以å®è¿åä¸ä¸ª Classæ°ç»ãç¨getSuperclass()æ¹æ³æ¥è·ååå°ç±»çç¶ç±»ï¼è¶ ç±»ï¼ï¼ç±äºä¸ä¸ªç±»åªè½ç»§æ¿èªä¸ä¸ªç±»ï¼æ以å®è¿åä¸ä¸ªClass对象ãä¸é¢æ们æ¥è·åä¸ä¸åå°ç±»çæ¹æ³java 代ç
import java.lang.reflect.*;
public class SampleMethod {
public static void main(String[] args) {
A p = new A();
printMethods(p);
}
public static void printMethods(Object o) {
Class c = o.getClass();
String className = c.getName();
Method[] m = c.getMethods();
for(int i=0; i<m.length; i++) {
//è¾åºæ¹æ³çè¿åç±»å
System.out.print(m[i].getReturnType().getName());
//è¾åºæ¹æ³å
System.out.print(" "+m[i].getName()+"(");
//è·åæ¹æ³çåæ°
Class[] parameterTypes = m[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(")");
}
}
} è¿ä¸ªä¾å并ä¸é¾ï¼å®åªæ¯è·å¾äºåå°ç±»çæææ¹æ³ï¼å æ¬ç»§æ¿èªå®ç¶ç±»çæ¹æ³ãç¶åè·åæ¹æ³çè¿åç±»åãæ¹æ³ååæ¹æ³åæ°ãæ¥ä¸æ¥è®©æ们åè¿å¤´æ¥æ³ä¸æ³ï¼æ们è·åäºåå°ç±»çå±æ§ãæé æ¹æ³ãç¶ç±»ãæ¥å£åæ¹æ³ï¼å¯è¿äºä¸è¥¿è½å¸®æ们åäºä»ä¹å¢ï¼ï¼
ä¸é¢æåä¸ä¸ªæ¯è¾å®æ´çå°ä¾åï¼æ¥è¯´æJavaçåå°ç±»è½åäºä»ä¹å§ï¼ï¼java 代ç
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class LoadMethod {
public Object Load(String cName,String MethodName,String[] type,String[] param){
Object retobj = null;
try {
//å è½½æå®çJavaç±»
Class cls = Class.forName(cName);
//è·åæå®å¯¹è±¡çå®ä¾
Constructor ct = cls.getConstructor(null);
Object obj = ct.newInstance(null);
//æ建æ¹æ³åæ°çæ°æ®ç±»å
Class partypes[] = this.getMethodClass(type);
//å¨æå®ç±»ä¸è·åæå®çæ¹æ³
Method meth = cls.getMethod(MethodName, partypes);
//æ建æ¹æ³çåæ°å¼
Object arglist[] = this.getMethodObject(type,param);
//è°ç¨æå®çæ¹æ³å¹¶è·åè¿åå¼ä¸ºObjectç±»å
retobj= meth.invoke(obj, arglist);
}
catch (Throwable e) {
System.err.println(e);
}
return retobj;
}
//è·ååæ°ç±»åClass[]çæ¹æ³
public Class[] getMethodClass(String[] type){
Class[] cs = new Class[type.length];
for (int i = 0; i < cs.length; i++) {
if(!type[i].trim().equals("")||type[i]!=null){
if(type[i].equals("int")||type[i].equals("Integer")){
cs[i]=Integer.TYPE;
}else if(type[i].equals("float")||type[i].equals("Float")){
cs[i]=Float.TYPE;
}else if(type[i].equals("double")||type[i].equals("Double")){
cs[i]=Double.TYPE;
}else if(type[i].equals("boolean")||type[i].equals("Boolean")){
cs[i]=Boolean.TYPE;
}else{
cs[i]=String.class;
}
}
}
return cs;
}
//è·ååæ°Object[]çæ¹æ³
public Object[] getMethodObject(String[] type,String[] param){
Object[] obj = new Object[param.length];
for (int i = 0; i < obj.length; i++) {
if(!param[i].trim().equals("")||param[i]!=null){
if(type[i].equals("int")||type[i].equals("Integer")){
obj[i]= new Integer(param[i]);
}else if(type[i].equals("float")||type[i].equals("Float")){
obj[i]= new Float(param[i]);
}else if(type[i].equals("double")||type[i].equals("Double")){
obj[i]= new Double(param[i]);
}else if(type[i].equals("boolean")||type[i].equals("Boolean")){
obj[i]=new Boolean(param[i]);
}else{
obj[i] = param[i];
}
}
}
return obj;
}
} è¿æ¯æå¨å·¥ä½ä¸åçä¸ä¸ªå®ç°Javaå¨è¿è¡æ¶å è½½æå®çç±»ï¼å¹¶è°ç¨æå®æ¹æ³çä¸ä¸ªå°ä¾åãè¿é没æmainæ¹æ³ï¼ä½ å¯ä»¥èªå·±åä¸ä¸ªã
Loadæ¹æ³æ¥æ¶çäºä¸ªåæ°åå«æ¯ï¼Javaçç±»åï¼æ¹æ³åï¼åæ°çç±»åååæ°çå¼ãç»æè¯ï¼
Javaè¯è¨åå°æä¾ä¸ç§å¨æé¾æ¥ç¨åºç»ä»¶çå¤åè½æ¹æ³ãå®å 许ç¨åºå建åæ§å¶ä»»ä½ç±»ç对象ï¼æ éæå硬ç¼ç ç®æ ç±»ãè¿äºç¹æ§ä½¿å¾åå°ç¹å«éç¨äºå建以é常æ®éçæ¹å¼ä¸å¯¹è±¡åä½çåºãJava reflection é常æç¨ï¼å®ä½¿ç±»åæ°æ®ç»æè½æå称å¨ææ£ç´¢ç¸å ³ä¿¡æ¯ï¼å¹¶å 许å¨è¿è¡ççç¨åºä¸æä½è¿äºä¿¡æ¯ãJava çè¿ä¸ç¹æ§é常强大ï¼å¹¶ä¸æ¯å ¶å®ä¸äºå¸¸ç¨è¯è¨ï¼å¦ CãC++ãFortran æè Pascal çé½ä¸å ·å¤çãä½åå°æ两个缺ç¹ã第ä¸ä¸ªæ¯æ§è½é®é¢ãç¨äºå段åæ¹æ³æ¥å ¥æ¶åå°è¦è¿æ ¢äºç´æ¥ä»£ç ãæ§è½é®é¢çç¨åº¦åå³äºç¨åºä¸æ¯å¦ä½ä½¿ç¨åå°çãå¦æå®ä½ä¸ºç¨åºè¿è¡ä¸ç¸å¯¹å¾å°æ¶åçé¨åï¼ç¼æ ¢çæ§è½å°ä¸ä¼æ¯ä¸ä¸ªé®é¢ãå³ä½¿æµè¯ä¸æåæ åµä¸ç计æ¶å¾æ¾ç¤ºçåå°æä½åªèç¨å å¾®ç§ãä» åå°å¨æ§è½å ³é®çåºç¨çæ ¸å¿é»è¾ä¸ä½¿ç¨æ¶æ§è½é®é¢æåå¾è³å ³éè¦ã
åå°çæ¦å¿µæ¯ç±Smithå¨1982å¹´é¦æ¬¡æåºçï¼ä¸»è¦æ¯æç¨åºå¯ä»¥è®¿é®ãæ£æµåä¿®æ¹å®æ¬èº«ç¶ææè¡ä¸ºçä¸ç§è½åãè¿ä¸æ¦å¿µçæåºå¾å¿«å¼åäºè®¡ç®æºç§å¦é¢åå ³äºåºç¨åå°æ§çç 究ãå®é¦å 被ç¨åºè¯è¨ç设计é¢åæéç¨,并å¨Lispåé¢å对象æ¹é¢åå¾äºæ绩ãå ¶ä¸LEAD/LEAD++ ãOpenC++ ãMetaXaåOpenJavaçå°±æ¯åºäºåå°æºå¶çè¯è¨ãæè¿ï¼åå°æºå¶ä¹è¢«åºç¨å°äºè§çªç³»ç»ãæä½ç³»ç»åæ件系ç»ä¸ãåå°æ¬èº«å¹¶ä¸æ¯ä¸ä¸ªæ°æ¦å¿µï¼å°½ç®¡è®¡ç®æºç§å¦èµäºäºåå°æ¦å¿µæ°çå«ä¹ãå¨è®¡ç®æºç§å¦é¢åï¼åå°æ¯æä¸ç±»åºç¨ï¼å®ä»¬è½å¤èªæè¿°åèªæ§å¶ãä¹å°±æ¯è¯´ï¼è¿ç±»åºç¨éè¿éç¨æç§æºå¶æ¥å®ç°å¯¹èªå·±è¡ä¸ºçæè¿°ï¼self-representationï¼åçæµï¼examinationï¼ï¼å¹¶è½æ ¹æ®èªèº«è¡ä¸ºçç¶æåç»æï¼è°æ´æä¿®æ¹åºç¨ææè¿°è¡ä¸ºçç¶æåç¸å ³çè¯ä¹ãäºãä»ä¹æ¯Javaä¸çç±»åå°ï¼
Reflection æ¯ Java ç¨åºå¼åè¯è¨çç¹å¾ä¹ä¸ï¼å®å 许è¿è¡ä¸ç Java ç¨åºå¯¹èªèº«è¿è¡æ£æ¥ï¼æè 说âèªå®¡âï¼å¹¶è½ç´æ¥æä½ç¨åºçå é¨å±æ§åæ¹æ³ãJava çè¿ä¸è½åå¨å®é åºç¨ä¸ç¨å¾ä¸æ¯å¾å¤ï¼ä½æ¯å¨å ¶å®çç¨åºè®¾è®¡è¯è¨ä¸æ ¹æ¬å°±ä¸åå¨è¿ä¸ç¹æ§ãä¾å¦ï¼PascalãC æè C++ ä¸å°±æ²¡æåæ³å¨ç¨åºä¸è·å¾å½æ°å®ä¹ç¸å ³çä¿¡æ¯ã
Reflection æ¯ Java 被è§ä¸ºå¨æï¼æåå¨æï¼è¯è¨çå ³é®ï¼å 许ç¨åºäºæ§è¡æ Reflection APIs åå¾ä»»ä½å·²ç¥åç§°ä¹ class çå é¨ä¿¡æ¯ï¼å æ¬ packageãtype parametersãsuperclassãimplemented interfacesãinner classes, outer class, fieldsãconstructorsãmethodsãmodifiersï¼å¹¶å¯äºæ§è¡æçæinstancesãåæ´ fields å 容æå¤èµ· methodsãä¸ãJavaç±»åå°ä¸æå¿ é¡»çç±»ï¼
Javaçç±»åå°æéè¦ç类并ä¸å¤ï¼å®ä»¬åå«æ¯ï¼FieldãConstructorãMethodãClassãObjectï¼ä¸é¢æå°å¯¹è¿äºç±»åä¸ä¸ªç®åç说æã
Fieldç±»ï¼æä¾æå ³ç±»ææ¥å£çå±æ§çä¿¡æ¯ï¼ä»¥å对å®çå¨æ访é®æéãåå°çå段å¯è½æ¯ä¸ä¸ªç±»ï¼éæï¼å±æ§æå®ä¾å±æ§ï¼ç®åçç解å¯ä»¥æå®çæä¸ä¸ªå°è£ åå°ç±»çå±æ§çç±»ã
Constructorç±»ï¼æä¾å ³äºç±»çå个æé æ¹æ³çä¿¡æ¯ä»¥å对å®ç访é®æéãè¿ä¸ªç±»åFieldç±»ä¸åï¼Fieldç±»å°è£ äºåå°ç±»çå±æ§ï¼èConstructorç±»åå°è£ äºåå°ç±»çæé æ¹æ³ã
Methodç±»ï¼æä¾å ³äºç±»ææ¥å£ä¸åç¬æ个æ¹æ³çä¿¡æ¯ãæåæ çæ¹æ³å¯è½æ¯ç±»æ¹æ³æå®ä¾æ¹æ³ï¼å æ¬æ½è±¡æ¹æ³ï¼ã è¿ä¸ªç±»ä¸é¾ç解ï¼å®æ¯ç¨æ¥å°è£ åå°ç±»æ¹æ³çä¸ä¸ªç±»ã
Classç±»ï¼ç±»çå®ä¾è¡¨ç¤ºæ£å¨è¿è¡ç Java åºç¨ç¨åºä¸çç±»åæ¥å£ãæ举æ¯ä¸ç§ç±»ï¼æ³¨éæ¯ä¸ç§æ¥å£ãæ¯ä¸ªæ°ç»å±äºè¢«æ å°ä¸º Class 对象çä¸ä¸ªç±»ï¼ææå ·æç¸åå ç´ ç±»ååç»´æ°çæ°ç»é½å ±äº«è¯¥ Class 对象ã
Objectç±»ï¼æ¯ä¸ªç±»é½ä½¿ç¨ Object ä½ä¸ºè¶ ç±»ãææ对象ï¼å æ¬æ°ç»ï¼é½å®ç°è¿ä¸ªç±»çæ¹æ³ãåãJavaçåå°ç±»è½åä»ä¹ï¼
çå®ä¸é¢çè¿ä¹å¤ææ³ä½ å·²ç»ä¸èç¦äºï¼ä½ 以为æå¨æµªè´¹ä½ çæ¶é´ï¼é£ä¹å¥½å§ï¼ä¸é¢æ们就ç¨ä¸äºç®åçå°ä¾åæ¥è¯´æå®ã
é¦å æ们æ¥çä¸ä¸éè¿Javaçåå°æºå¶æ们è½å¾å°äºä»ä¹ã
é¦å æ们æ¥åä¸ä¸ªç±»ï¼java 代ç
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
class A extends Object implements ActionListener{
private int a = 3;
public Integer b = new Integer(4);
public A(){}
public A(int id,String name){}
public int abc(int id,String name){return 0;}
public void actionPerformed(ActionEvent e){}
} ä½ å¯è½è¢«æè¿ä¸ªç±»å¼ç³æ¶äºï¼ä½ çä¸åºæè¦åä»ä¹ï¼é£å°±ä¸è¦çè¿ä¸ªç±»äºï¼è¿ä¸ªç±»æ¯ç¨æ¥æµè¯çï¼ä½ ç¥éç¥éå®ç»§æ¿äºObjectç±»ï¼æä¸ä¸ªæ¥å£æ¯ActionListenerï¼ä¸¤ä¸ªå±æ§intåInteger,两个æé æ¹æ³å两个æ¹æ³ï¼è¿å°±è¶³å¤äºã
ä¸é¢æ们æAè¿ä¸ªç±»ä½ä¸ºä¸ä¸ªåå°ç±»ï¼æ¥è¿å»Aç±»ä¸çä¸äºä¿¡æ¯ï¼é¦å æ们å æ¥è¿å»ä¸ä¸åå°ç±»ä¸çå±æ§åå±æ§å¼ãjava 代ç
import java.lang.reflect.*;
class B{
public static void main(String args[]){
A r = new A();
Class temp = r.getClass();
try{
System.out.println("åå°ç±»ä¸ææå ¬æçå±æ§");
Field[] fb =temp.getFields();
for(int j=0;j<fb.length;j++){
Class cl = fb[j].getType();
System.out.println("fb:"+cl);
}
System.out.println("åå°ç±»ä¸ææçå±æ§");
Field[] fa = temp.getDeclaredFields();
for(int j=0;j<fa.length;j++){
Class cl = fa[j].getType();
System.out.println("fa:"+cl);
}
System.out.println("åå°ç±»ä¸ç§æå±æ§çå¼");
Field f = temp.getDeclaredField("a");
f.setAccessible(true);
Integer i = (Integer)f.get(r);
System.out.println(i);
}catch(Exception e){
e.printStackTrace();
}
}
} è¿éç¨å°äºä¸¤ä¸ªæ¹æ³ï¼getFields()ãgetDeclaredFields()ï¼å®ä»¬åå«æ¯ç¨æ¥è·ååå°ç±»ä¸ææå ¬æå±æ§ååå°ç±»ä¸ææçå±æ§çæ¹æ³ãå¦å¤è¿ægetField(String)ågetDeclaredField(String)æ¹æ³é½æ¯ç¨æ¥è¿å»åå°ç±»ä¸æå®çå±æ§çæ¹æ³ï¼è¦æ³¨æçæ¯getFieldæ¹æ³åªè½åå°åå°ç±»ä¸å ¬æçå±æ§ï¼ègetDeclaredFieldæ¹æ³é½è½åå°ã
è¿éè¿ç¨å°äºField ç±»çsetAccessibleæ¹æ³ï¼å®æ¯ç¨æ¥è®¾ç½®æ¯å¦ææé访é®åå°ç±»ä¸çç§æå±æ§çï¼åªæ设置为trueæ¶æå¯ä»¥è®¿é®ï¼é»è®¤ä¸ºfalseãå¦å¤ Fieldç±»è¿æset(Object AttributeName,Object value)æ¹æ³ï¼å¯ä»¥æ¹åæå®å±æ§çå¼ãä¸é¢æ们æ¥çä¸ä¸å¦ä½è·ååå°ç±»ä¸çæé æ¹æ³java 代ç
import java.lang.reflect.*;
public class SampleConstructor {
public static void main(String[] args) {
A r = new A();
printConstructors(r);
}
public static void printConstructors(A r) {
Class c = r.getClass();
//è·åæå®ç±»çç±»å
String className = c.getName();
try {
//è·åæå®ç±»çæé æ¹æ³
Constructor[] theConstructors = c.getConstructors();
for(int i=0; i<theConstructors.length; i++) {
//è·åæå®æé æ¹æ³çåæ°çéå
Class[] parameterTypes = theConstructors[i].getParameterTypes();
System.out.print(className + "(");
for(int j=0; j<parameterTypes.length; j++)
System.out.print(parameterTypes[j].getName() + " ");
System.out.println(")");
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
è¿ä¸ªä¾åå¾ç®å,åªæ¯ç¨getConstructors()æ¹æ³è·åäºåå°ç±»çæé æ¹æ³çéåï¼å¹¶ç¨Constructorç±»çgetParameterTypes()è·å该æé æ¹æ³çåæ°ãä¸é¢æ们åæ¥è·åä¸ä¸åå°ç±»çç¶ç±»ï¼è¶ ç±»ï¼åæ¥å£java 代ç
import java.io.*;
import java.lang.reflect.*;
public class SampleInterface {
public static void main(String[] args) throws Exception {
A raf = new A();
printInterfaceNames(raf);
}
public static void printInterfaceNames(Object o) {
Class c = o.getClass();
//è·ååå°ç±»çæ¥å£
Class[] theInterfaces = c.getInterfaces();
for(int i=0; i<theInterfaces.length; i++)
System.out.println(theInterfaces[i].getName());
//è·ååå°ç±»çç¶ç±»ï¼è¶ ç±»ï¼
Class theSuperclass = c.getSuperclass();
System.out.println(theSuperclass.getName());
}
} è¿ä¸ªä¾åä¹å¾ç®åï¼åªæ¯ç¨Classç±»çgetInterfaces()æ¹æ³è·ååå°ç±»çæææ¥å£ï¼ç±äºæ¥å£å¯ä»¥æå¤ä¸ªï¼æ以å®è¿åä¸ä¸ª Classæ°ç»ãç¨getSuperclass()æ¹æ³æ¥è·ååå°ç±»çç¶ç±»ï¼è¶ ç±»ï¼ï¼ç±äºä¸ä¸ªç±»åªè½ç»§æ¿èªä¸ä¸ªç±»ï¼æ以å®è¿åä¸ä¸ªClass对象ãä¸é¢æ们æ¥è·åä¸ä¸åå°ç±»çæ¹æ³java 代ç
import java.lang.reflect.*;
public class SampleMethod {
public static void main(String[] args) {
A p = new A();
printMethods(p);
}
public static void printMethods(Object o) {
Class c = o.getClass();
String className = c.getName();
Method[] m = c.getMethods();
for(int i=0; i<m.length; i++) {
//è¾åºæ¹æ³çè¿åç±»å
System.out.print(m[i].getReturnType().getName());
//è¾åºæ¹æ³å
System.out.print(" "+m[i].getName()+"(");
//è·åæ¹æ³çåæ°
Class[] parameterTypes = m[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(")");
}
}
} è¿ä¸ªä¾å并ä¸é¾ï¼å®åªæ¯è·å¾äºåå°ç±»çæææ¹æ³ï¼å æ¬ç»§æ¿èªå®ç¶ç±»çæ¹æ³ãç¶åè·åæ¹æ³çè¿åç±»åãæ¹æ³ååæ¹æ³åæ°ãæ¥ä¸æ¥è®©æ们åè¿å¤´æ¥æ³ä¸æ³ï¼æ们è·åäºåå°ç±»çå±æ§ãæé æ¹æ³ãç¶ç±»ãæ¥å£åæ¹æ³ï¼å¯è¿äºä¸è¥¿è½å¸®æ们åäºä»ä¹å¢ï¼ï¼
ä¸é¢æåä¸ä¸ªæ¯è¾å®æ´çå°ä¾åï¼æ¥è¯´æJavaçåå°ç±»è½åäºä»ä¹å§ï¼ï¼java 代ç
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class LoadMethod {
public Object Load(String cName,String MethodName,String[] type,String[] param){
Object retobj = null;
try {
//å è½½æå®çJavaç±»
Class cls = Class.forName(cName);
//è·åæå®å¯¹è±¡çå®ä¾
Constructor ct = cls.getConstructor(null);
Object obj = ct.newInstance(null);
//æ建æ¹æ³åæ°çæ°æ®ç±»å
Class partypes[] = this.getMethodClass(type);
//å¨æå®ç±»ä¸è·åæå®çæ¹æ³
Method meth = cls.getMethod(MethodName, partypes);
//æ建æ¹æ³çåæ°å¼
Object arglist[] = this.getMethodObject(type,param);
//è°ç¨æå®çæ¹æ³å¹¶è·åè¿åå¼ä¸ºObjectç±»å
retobj= meth.invoke(obj, arglist);
}
catch (Throwable e) {
System.err.println(e);
}
return retobj;
}
//è·ååæ°ç±»åClass[]çæ¹æ³
public Class[] getMethodClass(String[] type){
Class[] cs = new Class[type.length];
for (int i = 0; i < cs.length; i++) {
if(!type[i].trim().equals("")||type[i]!=null){
if(type[i].equals("int")||type[i].equals("Integer")){
cs[i]=Integer.TYPE;
}else if(type[i].equals("float")||type[i].equals("Float")){
cs[i]=Float.TYPE;
}else if(type[i].equals("double")||type[i].equals("Double")){
cs[i]=Double.TYPE;
}else if(type[i].equals("boolean")||type[i].equals("Boolean")){
cs[i]=Boolean.TYPE;
}else{
cs[i]=String.class;
}
}
}
return cs;
}
//è·ååæ°Object[]çæ¹æ³
public Object[] getMethodObject(String[] type,String[] param){
Object[] obj = new Object[param.length];
for (int i = 0; i < obj.length; i++) {
if(!param[i].trim().equals("")||param[i]!=null){
if(type[i].equals("int")||type[i].equals("Integer")){
obj[i]= new Integer(param[i]);
}else if(type[i].equals("float")||type[i].equals("Float")){
obj[i]= new Float(param[i]);
}else if(type[i].equals("double")||type[i].equals("Double")){
obj[i]= new Double(param[i]);
}else if(type[i].equals("boolean")||type[i].equals("Boolean")){
obj[i]=new Boolean(param[i]);
}else{
obj[i] = param[i];
}
}
}
return obj;
}
} è¿æ¯æå¨å·¥ä½ä¸åçä¸ä¸ªå®ç°Javaå¨è¿è¡æ¶å è½½æå®çç±»ï¼å¹¶è°ç¨æå®æ¹æ³çä¸ä¸ªå°ä¾åãè¿é没æmainæ¹æ³ï¼ä½ å¯ä»¥èªå·±åä¸ä¸ªã
Loadæ¹æ³æ¥æ¶çäºä¸ªåæ°åå«æ¯ï¼Javaçç±»åï¼æ¹æ³åï¼åæ°çç±»åååæ°çå¼ãç»æè¯ï¼
Javaè¯è¨åå°æä¾ä¸ç§å¨æé¾æ¥ç¨åºç»ä»¶çå¤åè½æ¹æ³ãå®å 许ç¨åºå建åæ§å¶ä»»ä½ç±»ç对象ï¼æ éæå硬ç¼ç ç®æ ç±»ãè¿äºç¹æ§ä½¿å¾åå°ç¹å«éç¨äºå建以é常æ®éçæ¹å¼ä¸å¯¹è±¡åä½çåºãJava reflection é常æç¨ï¼å®ä½¿ç±»åæ°æ®ç»æè½æå称å¨ææ£ç´¢ç¸å ³ä¿¡æ¯ï¼å¹¶å 许å¨è¿è¡ççç¨åºä¸æä½è¿äºä¿¡æ¯ãJava çè¿ä¸ç¹æ§é常强大ï¼å¹¶ä¸æ¯å ¶å®ä¸äºå¸¸ç¨è¯è¨ï¼å¦ CãC++ãFortran æè Pascal çé½ä¸å ·å¤çãä½åå°æ两个缺ç¹ã第ä¸ä¸ªæ¯æ§è½é®é¢ãç¨äºå段åæ¹æ³æ¥å ¥æ¶åå°è¦è¿æ ¢äºç´æ¥ä»£ç ãæ§è½é®é¢çç¨åº¦åå³äºç¨åºä¸æ¯å¦ä½ä½¿ç¨åå°çãå¦æå®ä½ä¸ºç¨åºè¿è¡ä¸ç¸å¯¹å¾å°æ¶åçé¨åï¼ç¼æ ¢çæ§è½å°ä¸ä¼æ¯ä¸ä¸ªé®é¢ãå³ä½¿æµè¯ä¸æåæ åµä¸ç计æ¶å¾æ¾ç¤ºçåå°æä½åªèç¨å å¾®ç§ãä» åå°å¨æ§è½å ³é®çåºç¨çæ ¸å¿é»è¾ä¸ä½¿ç¨æ¶æ§è½é®é¢æåå¾è³å ³éè¦ã
温馨提示:答案为网友推荐,仅供参考