• Java之反射的详细解析二


    1.8 获取成员变量并获取值和修改值

    方法说明
    void set(Object obj, Object value)赋值
    Object get(Object obj)获取值

    代码示例:

    1. public class ReflectDemo5 {
    2.    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
    3.        Student s = new Student("zhangsan",23,"广州");
    4.        Student ss = new Student("lisi",24,"北京");
    5.        //需求:
    6.        //利用反射获取成员变量并获取值和修改值
    7.        //1.获取class对象
    8.        Class clazz = Class.forName("com.itheima.reflectdemo.Student");
    9.        //2.获取name成员变量
    10.        //field就表示name这个属性的对象
    11.        Field field = clazz.getDeclaredField("name");
    12.        //临时修饰他的访问权限
    13.        field.setAccessible(true);
    14.        //3.设置(修改)name的值
    15.        //参数一:表示要修改哪个对象的name?
    16.        //参数二:表示要修改为多少?
    17.        field.set(s,"wangwu");
    18.        //3.获取name的值
    19.        //表示我要获取这个对象的name的值
    20.        String result = (String)field.get(s);
    21.        //4.打印结果
    22.        System.out.println(result);
    23.        System.out.println(s);
    24.        System.out.println(ss);
    25.   }
    26. }
    27. public class Student {
    28.    private String name;
    29.    private int age;
    30.    public String gender;
    31.    public String address;
    32.    public Student() {
    33.   }
    34.    public Student(String name, int age, String address) {
    35.        this.name = name;
    36.        this.age = age;
    37.        this.address = address;
    38.   }
    39.    public Student(String name, int age, String gender, String address) {
    40.        this.name = name;
    41.        this.age = age;
    42.        this.gender = gender;
    43.        this.address = address;
    44.   }
    45.    /**
    46.     * 获取
    47.     * @return name
    48.     */
    49.    public String getName() {
    50.        return name;
    51.   }
    52.    /**
    53.     * 设置
    54.     * @param name
    55.     */
    56.    public void setName(String name) {
    57.        this.name = name;
    58.   }
    59.    /**
    60.     * 获取
    61.     * @return age
    62.     */
    63.    public int getAge() {
    64.        return age;
    65.   }
    66.    /**
    67.     * 设置
    68.     * @param age
    69.     */
    70.    public void setAge(int age) {
    71.        this.age = age;
    72.   }
    73.    /**
    74.     * 获取
    75.     * @return gender
    76.     */
    77.    public String getGender() {
    78.        return gender;
    79.   }
    80.    /**
    81.     * 设置
    82.     * @param gender
    83.     */
    84.    public void setGender(String gender) {
    85.        this.gender = gender;
    86.   }
    87.    /**
    88.     * 获取
    89.     * @return address
    90.     */
    91.    public String getAddress() {
    92.        return address;
    93.   }
    94.    /**
    95.     * 设置
    96.     * @param address
    97.     */
    98.    public void setAddress(String address) {
    99.        this.address = address;
    100.   }
    101.    public String toString() {
    102.        return "Student{name = " + name + ", age = " + age + ", gender = " + gender + ", address = " + address + "}";
    103.   }
    104. }

    1.9 获取成员方法

    规则:

    get表示获取

    Declared表示私有

    最后的s表示所有,复数形式

    如果当前获取到的是私有的,必须要临时修改访问权限,否则无法使用

    方法名说明
    Method[] getMethods()返回所有成员方法对象的数组(只能拿public的)
    Method[] getDeclaredMethods()返回所有成员方法对象的数组,存在就能拿到
    Method getMethod(String name, Class... parameterTypes)返回单个成员方法对象(只能拿public的)
    Method getDeclaredMethod(String name, Class... parameterTypes)返回单个成员方法对象,存在就能拿到

    代码示例:

    1. public class ReflectDemo6 {
    2.    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
    3.        //1.获取class对象
    4.        Class clazz = Class.forName("com.itheima.reflectdemo.Student");
    5.        //2.获取方法
    6.        //getMethods可以获取父类中public修饰的方法
    7.        Method[] methods1 = clazz.getMethods();
    8.        for (Method method : methods1) {
    9.            System.out.println(method);
    10.       }
    11.        System.out.println("===========================");
    12.        //获取所有的方法(包含私有)
    13.        //但是只能获取自己类中的方法
    14.        Method[] methods2 = clazz.getDeclaredMethods();
    15.        for (Method method : methods2) {
    16.            System.out.println(method);
    17.       }
    18.        System.out.println("===========================");
    19.        //获取指定的方法(空参)
    20.        Method method3 = clazz.getMethod("sleep");
    21.        System.out.println(method3);
    22.        Method method4 = clazz.getMethod("eat",String.class);
    23.        System.out.println(method4);
    24.        //获取指定的私有方法
    25.        Method method5 = clazz.getDeclaredMethod("playGame");
    26.        System.out.println(method5);
    27.   }
    28. }

    1.10 获取成员方法并运行

    方法

    Object invoke(Object obj, Object... args) :运行方法

    参数一:用obj对象调用该方法

    参数二:调用方法的传递的参数(如果没有就不写)

    返回值:方法的返回值(如果没有就不写)

    代码示例:

    1. package com.itheima.a02reflectdemo1;
    2. import java.lang.reflect.InvocationTargetException;
    3. import java.lang.reflect.Method;
    4. public class ReflectDemo6 {
    5.    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
    6.        //1.获取字节码文件对象
    7.        Class clazz = Class.forName("com.itheima.a02reflectdemo1.Student");
    8.        //2.获取一个对象
    9.        //需要用这个对象去调用方法
    10.        Student s = new Student();
    11.        
    12.        //3.获取一个指定的方法
    13.        //参数一:方法名
    14.        //参数二:参数列表,如果没有可以不写
    15.        Method eatMethod = clazz.getMethod("eat",String.class);
    16.        
    17.        //运行
    18.        //参数一:表示方法的调用对象
    19.        //参数二:方法在运行时需要的实际参数
    20.        //注意点:如果方法有返回值,那么需要接收invoke的结果
    21.        //如果方法没有返回值,则不需要接收
    22.        String result = (String) eatMethod.invoke(s, "重庆小面");
    23.        System.out.println(result);
    24.   }
    25. }
    26. public class Student {
    27.    private String name;
    28.    private int age;
    29.    public String gender;
    30.    public String address;
    31.    public Student() {
    32.   }
    33.    public Student(String name) {
    34.        this.name = name;
    35.   }
    36.    private Student(String name, int age) {
    37.        this.name = name;
    38.        this.age = age;
    39.   }
    40.    /**
    41.     * 获取
    42.     * @return name
    43.     */
    44.    public String getName() {
    45.        return name;
    46.   }
    47.    /**
    48.     * 设置
    49.     * @param name
    50.     */
    51.    public void setName(String name) {
    52.        this.name = name;
    53.   }
    54.    /**
    55.     * 获取
    56.     * @return age
    57.     */
    58.    public int getAge() {
    59.        return age;
    60.   }
    61.    /**
    62.     * 设置
    63.     * @param age
    64.     */
    65.    public void setAge(int age) {
    66.        this.age = age;
    67.   }
    68.    public String toString() {
    69.        return "Student{name = " + name + ", age = " + age + "}";
    70.   }
    71.    private void study(){
    72.        System.out.println("学生在学习");
    73.   }
    74.    private void sleep(){
    75.        System.out.println("学生在睡觉");
    76.   }
    77.    public String eat(String something){
    78.        System.out.println("学生在吃" + something);
    79.        return "学生已经吃完了,非常happy";
    80.   }
    81. }

  • 相关阅读:
    短期经济波动:均衡国民收入决定理论(三)
    python-爬虫-爬取中华人民共和国农业农村部网站公开的农产品批发价格中的蔬菜价格周数据
    C++报错信息:LNK2001:无法解析的外部符号 原因分析及解决方法
    华为认证HCIA H12-811 Datacom数通考试真题题库【带答案刷题必过】【第一部分】
    Centos7下MongoDB安装到基本命令的学习
    vue3.2新功能
    全数字系列-麦克风K歌模组-搭配投影仪专业方案
    重生奇迹MU装备好坏如何判断
    【Linux】权限
    IP协议介绍
  • 原文地址:https://blog.csdn.net/qq_69748833/article/details/133758659