JAVA反射機(jī)制
? ? ? JAVA反射機(jī)制是在運(yùn)行狀態(tài)中撒遣,對(duì)于任意一個(gè)類涧窒,都能夠知道這個(gè)類的所有屬性和方法夸赫;對(duì)于任意一個(gè)對(duì)象空入,都能夠調(diào)用它的任意一個(gè)方法络它;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語言的反射機(jī)制。
獲取Class對(duì)象有三種方式:
1.通過Object類的getClass()方法歪赢。例如:
Class c1 = new String("").getClass();
2.通過Class類的靜態(tài)方法——forName()來實(shí)現(xiàn):
Class c2 = Class.forName("MyObject"); ? ? ? ? //傳入一個(gè)類名的字符串
3.如果T是一個(gè)已定義的類型的話化戳,在java中,它的.class文件名:T.class就代表了與其匹配的Class對(duì)象埋凯,例如:
Class c3 = Manager.class;
Class c4 = int.class;
Class c5 = Double[].class;
了解類的信息
獲得本類聲明的方法
getName();? ? ? //這個(gè)方法就是返回String形式的該類的簡要描述
獲得所有方法
ClassdogClazz = Dog.class;
Method[] methods = dogClazz.getMethods(); ? ? ? ? //獲得所有公共的方法
Method[] methods2 = dogClazz.getDeclaredMethods(); ? ? ? ? ? ?//獲得自己定義的方法
獲得父類信息
Class superClazz = chineseClazz.getSuperclass();
獲得接口信息
Class[] interfaceClazz = chineseClazz.getInterfaces();
根據(jù)Class對(duì)象創(chuàng)建instance
方法1
ClassdogClazz = Dog.class;
Object o = dogClazz.newInstance(); ? ? ? ? ? //Dog類中必須有無參的構(gòu)造函數(shù)
方法2
Constructor c = dogClazz.getConstructor(new Class[]{String.class, int.class}); ? ? ?//根據(jù)Dog類中的構(gòu)造函數(shù)点楼,創(chuàng)建一個(gè)構(gòu)造器。
Dog o2 = (Dog) c.newInstance("xiaohei",3);
操作成員變量
ClassdogClazz = Dog.class;
Object o = dogClazz.newInstance();
Field[] fields = dogClazz.getFields();
for(Field f: fields){
System.out.println(f.getName());
}
Field field = dogClazz.getField("name");
field.set(o, "zhangsan");
Field field2 = dogClazz.getDeclaredField("age");
field2.setAccessible(true); ? ? ? ? ? ? ? ? ? ? //否則不能訪問到Dog類中的私有變量
field2.set(o, 3);
調(diào)用成員方法
ClassdogClazz = Dog.class;
Object o = dogClazz.newInstance();
Method m = dogClazz.getMethod("bark", new Class[]{Dog.class}); ? ? ? //傳入方法名白对,和參數(shù)
m.invoke(o, new Object[]{o}); ? ? ? ? ? ? ? ? //調(diào)用方法