packagecom.imooc.reflect.test; publicclassPerson { publicPerson() { super(); } publicPerson(Stringname, Stringsex) { super(); this.name=name; this.sex=sex; } privateStringname; privateStringsex; /* public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}*/publicvoideat(){ System.out.println("吃...."); } privatevoidrun(){ System.out.println("跑....."); } publicStringsayHello(Stringname){ return"Hello "+name; } @OverridepublicStringtoString() { return"Person [name="+name+", sex="+sex+"]"; } }
packagecom.imooc.reflect.test; importorg.junit.Test; publicclassClassTest { @Test/*** 获得Class对象* * 1.通过类名.class* * 2.对象.getClass()* * 3.Class.forName();*/publicvoiddemo1() throwsClassNotFoundException{ // 1.通过类名.class的方式Classclazz1=Person.class; // 2.通过对象.getClass()的方式Personperson=newPerson(); Classclazz2=person.getClass(); // 3.Class类forName();获得(推荐)Classclazz3=Class.forName("com.imooc.reflect.test.Person"); } }
Ps:getClass() 方式有点傻,都已经有对象了,直接用就可以了,还需要通过你干啥子嘞?!
packagecom.imooc.reflect.test; importjava.lang.reflect.Constructor; importorg.junit.Test; publicclassConstructorTest { @Test/*** 获得无参数的构造方法*/publicvoiddemo1() throwsException{ // 获得类的字节码文件对应的对象:Classclass1=Class.forName("com.imooc.reflect.test.Person"); Constructorc=class1.getConstructor(); Personperson= (Person) c.newInstance();// 相当于Person person = new Person();// person.eat(); } @Test/*** 获得有参数的构造方法*/publicvoiddemo2() throwsException{ Classclass1=Class.forName("com.imooc.reflect.test.Person"); Constructorc=class1.getConstructor(String.class,String.class); Personperson= (Person) c.newInstance("张三","男");// Person person = new Person("张三","男");System.out.println(person); } }
Ps:getConstructor() // 可以填写0~N个参数,0个参数代表获得无参构造方法。
packagecom.imooc.reflect.test; importjava.lang.reflect.Field; importorg.junit.Test; publicclassFieldTest { @Test// 测试公有的属性publicvoiddemo1() throwsException{ // 获得ClassClassclass1=Class.forName("com.imooc.reflect.test.Person"); // 获得属性:Fieldfield=class1.getField("name"); // 操作属性: p.name = "";Personp= (Person) class1.newInstance(); field.set(p, "李四");// p.name = "李四";Objectobj=field.get(p); System.out.println(obj); } @Test// 测试私有的属性publicvoiddemo2() throwsException{ // 获得ClassClassclass1=Class.forName("com.imooc.reflect.test.Person"); // 获得私有的属性Fieldfield=class1.getDeclaredField("sex"); // 操作属性:Personp= (Person) class1.newInstance(); // 私有属性,需要设置一个可访问的权限:field.setAccessible(true); field.set(p, "男"); // 获取值:Objectobj=field.get(p); System.out.println(obj); System.out.println(p); } }
Ps:属性也可以通过person.name=”zhangsan”; 来设置。
packagecom.imooc.reflect.test; importjava.lang.reflect.Method; importorg.junit.Test; publicclassMethodTest { @Test// 测试公有的方法publicvoiddemo1() throwsException{ Classclass1=Class.forName("com.imooc.reflect.test.Person"); // 实例化:Personperson= (Person) class1.newInstance(); // 获得公有的方法Methodmethod=class1.getMethod("eat"); // 执行该方法:method.invoke(person); // person.eat(); } @Test// 测试私有的方法publicvoiddemo2() throwsException{ Classclass1=Class.forName("com.imooc.reflect.test.Person"); // 实例化:Personperson= (Person) class1.newInstance(); // 获得方法:Methodmethod=class1.getDeclaredMethod("run"); // 设置私有的属性的访问权限:method.setAccessible(true); // 执行该方法:method.invoke(person, null); } @Test// 测试私有的方法带参数publicvoiddemo3() throwsException{ Classclass1=Class.forName("com.imooc.reflect.test.Person"); // 实例化:Personperson= (Person) class1.newInstance(); // 获得该方法:Methodmethod=class1.getDeclaredMethod("sayHello", String.class); // 设置访问权限:method.setAccessible(true); // 执行:Objectobj=method.invoke(person, "Tom"); System.out.println(obj); } }
Ps:method.invoke(person,null) 等价于 method.invoke(person)。