day44-反射03( 四 )


day44-反射03

文章插图
  • 访问方法
    1. 根据方法名和参数列表获取Method方法对象:
      Method m = 类的Class对象.getDeclaredMethod(方法名,XX.class);//得到本类的所有方法
      XX.class指方法的参数对应的class
    2. 获取对象:Object o = 类的Class对象.newInstance();
    3. 爆破:m.setAccessible(true);
    4. 访问:Object returnValue = https://www.huyubaike.com/biancheng/m.invoke(o,实参列表);
    5. 注意:如果过是静态方法,则invoke的参数o可以写为null
例子:
package li.reflection;import java.lang.reflect.Method;//演示通过反射操作方法public class ReflectAccessMethod {public static void main(String[] args) throws Exception {//1.得到Boss类对应的Class对象Class<?> bossCls = Class.forName("li.reflection.Boss");//2.创建对象Object o = bossCls.newInstance();//3.调用普通的public的hi方法//3.1得到hi方法对应的方法对象Method hi = bossCls.getMethod("hi", String.class);//3.2调用hi.invoke(o, "孙悟空");//4.调用private static 方法//注意点:1.private:要使用爆破;2.static:在invoke时的参数可以写null//4.1得到 say 方法对象Method say = bossCls.getDeclaredMethod("say", int.class, String.class, char.class);//4.2爆破say.setAccessible(true);//4.3invoke的nullSystem.out.println(say.invoke(o, 100, "张三", '男'));System.out.println(say.invoke(null, 999, "李四", '女'));//因为是静态的方法,所以o可以写为null//5.在反射中,如果方法有返回值,统一返回Object,但其运行类型和方法定义的返回类型一致Object reVal = say.invoke(null, 300, "jack", '男');System.out.println("reVal的运行类型=" + reVal.getClass());//String}}class Boss {public int age;private static String name;public Boss() {}private static String say(int n, String s, char c) {//静态方法return n + " " + s + " " + c;}public void hi(String s) {//普通的public方法System.out.println("hi " + s);}}
day44-反射03

文章插图
6.本章作业6.1练习1:通过反射修改私有成员变量
  1. 定义privateTest类,有私有属性name,并且属性值为"hellokitty"
  2. 提供getName的公有方法
  3. 创建PrivateTest的类,利用Class类的到私有属性name,修改其属性值,并调用getName()的方法打印name属性值
package li.reflection.homework;import java.lang.reflect.Field;import java.lang.reflect.Method;public class homework01 {public static void main(String[] args) throws Exception {//1.得到PrivateTest对应的Class对象Class<?> privateTestCls = Class.forName("li.reflection.homework.PrivateTest");//2.创建对象Object o = privateTestCls.newInstance();//3.得到name属性对象Field name = privateTestCls.getDeclaredField("name");//4.爆破name.setAccessible(true);name.set(o,"天龙八部");//5.得到getName方法的对象Method method = privateTestCls.getMethod("getName");//6.因为getName是public方法,直接调用即可Object invoke = method.invoke(o);System.out.println("name属性的值="+invoke);}}class PrivateTest{private String name = "HelloKitty";public String getName(){return name;}}
day44-反射03

文章插图
6.2练习:利用反射和File完成以下功能
  1. 利用Class类的forName方法得到File类的class对象
  2. 在控制台打印File类的所有构造器
  3. 通过newInstance方法创建File对象,并创建d:\mynew.txt文件
提示:创建文件的正确写法如下:
File file = new File("d:\mynew.txt");
file.creatNewFile();
package li.reflection.homework;import java.lang.reflect.Constructor;import java.lang.reflect.Method;public class homework02 {public static void main(String[] args) throws Exception {//得到File类对应的class类对象Class<?> fileCls = Class.forName("java.io.File");//得到所有的构造器Constructor<?>[] declaredConstructors = fileCls.getDeclaredConstructors();System.out.println("=====File的所有构造器=====");//遍历输出构造器for (Constructor<?> declaredConstructor : declaredConstructors) {System.out.println(declaredConstructor);}//指定得到 public java.io.File(java.lang.String)Constructor<?> constructor = fileCls.getConstructor(String.class);//创建File类对象Object file = constructor.newInstance("d:\\mynew.txt");//获取createNewFile方法的对象Method createNewFile = fileCls.getDeclaredMethod("createNewFile");//调用createNewFile.invoke(file);}}

经验总结扩展阅读