1.什么是反射? 一个类有多个组成部分,例如:成员变量,方法,构造方法等。 反射就是加载类,并解剖出类的各个组成部分。
2.加载类 java中有一个Class类用于代表某一个类的字节码。 Class类既然代表某个类的字节码,那就要提供加载某个类 字节码的方法:forName(). 此方法用于加载某个类的字节码 到内存中,并使用class对象进行封装。 另外2种得到class对象的方式: 类名.class 对象.getClass()
先创建一个简单的Person类
复制代码 代码如下: public class ReflectDemo { public static void main(String args[]) throws Exception { //1. Class clazz = Class.forName("dsa.Person") ;
//2. Class clazz1 = new Person().getClass() ;
//3. Classclazz2=Person.class; } }
3.反射构造方法
Person类中:
复制代码 代码如下: /** *构造方法 */ publicPerson(){ System.out.println("null"); }
publicPerson(Stringname){ System.out.println(name); }
publicPerson(Stringname,intpwd){ System.out.println(name+"+"+pwd); }
privatePerson(Listlist){ System.out.println("List"); }
测试类中:
复制代码 代码如下: //反射publicPerson() @Test publicvoidtest1()throwsException{ Classclazz=Class.forName("RflectorDemo.Person"); Constructorcr=clazz.getConstructor(null);//获取构造器对象 Personp=(Person)cr.newInstance(null);//通过构造器实例化对象 //System.out.println(p.name); }
//反射publicPerson(Stringname) @Test publicvoidtest2()throwsException{ Classclazz=Class.forName("RflectorDemo.Person"); Constructorcr=clazz.getConstructor(String.class); Personp=(Person)cr.newInstance("haha"); System.out.println(p.name); }
//反射publicPerson(Stringname,intpwd) @Test publicvoidtest3()throwsException{ Classclazz=Class.forName("RflectorDemo.Person"); Constructorcr=clazz.getConstructor(String.class,int.class); Personp=(Person)cr.newInstance("haha",1); //System.out.println(p.name); }
//反射publicPerson(Listlist) @Test publicvoidtest4()throwsException{ Classclazz=Class.forName("RflectorDemo.Person"); Constructorcr=clazz.getDeclaredConstructor(List.class); cr.setAccessible(true);//暴力破解 Personp=(Person)cr.newInstance(newArrayList()); System.out.println(p.name); } //另一种创建对象的途径,只适用于无参的构造方法 @Test publicvoidtest5()throwsException{ Classclazz=Class.forName("RflectorDemo.Person");
Personp=(Person)clazz.newInstance(); System.out.println(p.name); }
当构造方法是私有的,我们就进行暴力破解!!!
4.反射常规方法
Person类中:
复制代码 代码如下: /** *方法 */ publicvoidjf() {
} publicvoidjf(Stringname,intpwd) {
} publicClass[]jf(Stringname,int[]pwd) { returnnewClass[]{String.class,int.class}; } privatevoidjf(InputStreamin) { System.out.println(in); } publicstaticvoidjf(intnum) { System.out.println(num); } publicstaticvoidmain(Stringargs[]) { System.out.println("main!!!"); }
测试类中:
复制代码 代码如下: /** *反射类的方法 * *@authortanlvxu * */ publicclassDemo2{
//反射类的方法:publicvoidjf() @Test publicvoidtest1()throwsException{ Personp=newPerson(); Classclazz=Class.forName("RflectorDemo.Person"); Methodmethod=clazz.getMethod("jf",null); method.invoke(p,null); }
//反射类的方法:publicvoidjf(Stringname,intpwd) @Test publicvoidtest2()throwsException{ Personp=newPerson(); Classclazz=Class.forName("RflectorDemo.Person"); Methodmethod=clazz.getMethod("jf",String.class,int.class); method.invoke(p,"dsa",30); }
//反射类的方法:publicClass[]jf(Stringname,int[]pwd) @Test publicvoidtest3()throwsException{ Personp=newPerson(); Classclazz=Class.forName("RflectorDemo.Person"); Methodmethod=clazz.getMethod("jf",int[].class); Classcs[]=(Class[])method.invoke(p,"aads",newint[]{1,2,3}); System.out.println(cs[0]); }
//反射类的方法:privatevoidjf(InputStreamin) @Test publicvoidtest4()throwsException{ Personp=newPerson(); Classclazz=Class.forName("RflectorDemo.Person"); Methodmethod=clazz.getDeclaredMethod("jf",InputStream.class); method.setAccessible(true); method.invoke(p,newFileInputStream("d:qqClient.txt")); }
//反射类的方法:publicstaticvoidjf(intnum) @Test publicvoidtest5()throwsException{ Classclazz=Class.forName("RflectorDemo.Person"); Methodmethod=clazz.getMethod("jf",int.class); method.invoke(null,30); }
//反射类的方法:publicstaticvoidm(intnum) @Test publicvoidtest6()throwsException{ Classclazz=Class.forName("RflectorDemo.Person"); Methodmethod=clazz.getMethod("main",String[].class); //method.invoke(null,(Object)newString[]{"ds","das"}); method.invoke(null,newObject[]{newString[]{"ds","das"}}); }
5.反射字段
PerSon类中:
复制代码 代码如下: /** *字段 */ publicStringname="swr"; privateintpassword=45; privatestaticintage=35; 测试类中:
Java代码 /** *反射类的字段 *@authortanlvxu * */ publicclassDemo3{ /** *反射字段publicStringname="swr"; *@throwsException */ @Test publicvoidtest1()throwsException { Personp=newPerson(); Classclazz=Class.forName("RflectorDemo.Person"); Fieldf=clazz.getField("name"); //获取字段的值 Objectvalue=f.get(p); //获取字段的类型 Classtype=f.getType(); if(type.equals(String.class)){ Stringname=(String)f.get(p); System.out.println(name); }
//设置字段的值 f.set(p,"dfafa"); System.out.println(p.name);
}
/** *反射字段privateintpassword; *@throwsException */ @Test publicvoidtest2()throwsException { Personp=newPerson(); Classclazz=Class.forName("RflectorDemo.Person"); Fieldf=clazz.getDeclaredField("password"); f.setAccessible(true); f.set(p,36); System.out.println(f.get(p));
}
/** *反射字段privatestaticintage=35; *@throwsException */ @Test publicvoidtest3()throwsException { Classclazz=Class.forName("RflectorDemo.Person"); Fieldf=clazz.getDeclaredField("age"); f.setAccessible(true); f.set(null,24); System.out.println(f.get(null));
}
其实无论反射构造方法,或者字段都大致相同,我们可以举一反三! (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|