一個(gè)類有多個(gè)組成部分,例如:成員變量,方法,構(gòu)造方法等。
反射就是加載類,并解剖出類的各個(gè)組成部分
反射:加載類獲得類的直接碼(3種方法)
1.Class clazz =Class.forName("cn.itcast.reflect.person");
2.Class clazz1=new Person().getClass();
3.Class clazz2=person.class;
反射構(gòu)造函數(shù),創(chuàng)建類的對(duì)象
帶String參數(shù)的構(gòu)造函數(shù)
Class clazz =Class.forname("cn.itcast.reflect.person");//加載類
Constructor c=clazz.getConstructor(String.class); //創(chuàng)建構(gòu)造函數(shù)
Person p=(person) c.newInstance("xxxx"); //創(chuàng)建實(shí)例并傳參
帶String int的構(gòu)造函數(shù)函數(shù)
Class clazz =Class.forname("cn.itcast.reflect.person");//加載類
Constructor c=clazz.getConstructor(String.class,int.class); //創(chuàng)建構(gòu)造函數(shù)
Person p=(person) c.newInstance("xxxx",12); //創(chuàng)建實(shí)例并傳參
私有構(gòu)造函數(shù)
Class clazz =Class.forname("cn.itcast.reflect.person");//加載類
Constructor c=clazz.getDeclareConstructor(List.class); //創(chuàng)建構(gòu)造函數(shù)
c.setaccessible(ture);//暴力反射,可以反射私有構(gòu)造函數(shù),實(shí)現(xiàn)訪問私有
Person p=(person) c.newInstance(new ArrayList()); //創(chuàng)建實(shí)例并傳參
創(chuàng)建對(duì)象的另外一種途徑
Class clazz =Class.forname("cn.itcast.reflect.person");//加載類
person p=(Person) clazz.newInstance();
不用反射構(gòu)造函數(shù),實(shí)際上他反射的是這個(gè)類的無參構(gòu)造函數(shù)。想要這個(gè)方法正常
工作,意味著這個(gè)類里面必須要有一個(gè)無參構(gòu)造函數(shù)
這個(gè)方法等效于
Class clazz =Class.forname("cn.itcast.reflect.person");//加載類
Constructor c=clazz.getConstructor(null); //創(chuàng)建構(gòu)造函數(shù)
Person p=(person) c.newInstance(null); //創(chuàng)建實(shí)例并傳參
反射類的方法
反射類的方法:public void aa1()
person p =new Person();
Class clazz=class.forName("cn.itcast.reflect.person");
Method method=clazz.getMethod("aa1",null);
method.invoke(p,null);
反射類的方法:public void aa1(string name,int passworld)
person p=new Person();
Class clazz=class.forName("cn.itcast.reflect.person");
Method method=clazz.getMethod("aa1",String.class,int.class);
method.invoke(p,"zxx",38);
反射類的方法:public class[] aa1(String name,int[] passworld)
person p=new Person();
Class clazz=class.forName("cn.itcast.reflect.person");
Method method=clazz.getMethod("aa1",String.class,int[].class);
Class cs[]=(Class[]) method.invoke(p,"aaa",new int[]{1,23});
反射類的方法:PRivate void aa1(InputStream in)
person p=new Person();
Class class="class".forname("cn.itcast.reflect.person");
Method method=clazz.getDeclaredMethod("aa1",InputStream.class);
method.setAccessible(true);
mrthod.invoke(p,new FileInputStream("c://1.txt"));
反射類的方法:public static void aa1(int num)
person p=new Person();
Class class="class".forname("cn.itcast.reflect.person");
Method method=class.getMethod("aa1",int.class);
method.invoke(null,23)
反射類的方法:public static void main(String[] args)
Class clazz=class.forname("cn.itcast.reflect.person");
Method method=class.getMethod("main",String[].class);
//method.invoke(null,(Object)new String[]("aa","bb"));
method.invoke(null,new Object[](new String[]("aa","bb")));
當(dāng)反射的方法參數(shù)是數(shù)組時(shí)要注意,若直接寫“method.invoke(null,new String[]("aa","bb"))”會(huì)報(bào)參數(shù)個(gè)數(shù)的錯(cuò),
在jdk1.4中其會(huì)將其解析為a(String s1,String s2)將數(shù)組拆開作為參數(shù)。而其后高版本的jdk都兼容1.4版本。
這個(gè)問題是由jdk引起的。所以應(yīng)該用以上的2種方法將參數(shù)是數(shù)組的方法的反射方式進(jìn)行改寫。
反射類的字段
反射字段:public String name="aaaa";
public void test1() throw Exception{
person p=new person();
Class clazz=Class.forName("cn.itcast.reflect.person");
Field f=clazz.getField("name");
Object obj=f.get(p);//獲取字段的值
Class type=f.getType();//獲取字段的類型
f.set(p,"xxxxx");設(shè)置字段的值
}
反射字段:private int name="aaaa";
public void test2() throw Exception{
person p=new person();
Class clazz=Class.forName("cn.itcast.reflect.person");
Field f=clazz.getDeclareField("passworld");
f.setAccessible(true);
//Object obj=f.get(p);//獲取字段的值
//Class type=f.getType();//獲取字段的類型
//f.set(p,"xxxxx");設(shè)置字段的值
system.out.println(f.get(p));
}
反射字段:private static int age=23;
public void test3() throw Exception{
person p=new person();
Class clazz=Class.forName("cn.itcast.reflect.person");
Field f=clazz.getDeclareField("age");
f.setAccessible(true);
//Object obj=f.get(p);//獲取字段的值
//Class type=f.getType();//獲取字段的類型
//f.set(p,"xxxxx");設(shè)置字段的值
system.out.println(f.get(p));
}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注