JAVA 通过反射获取公共和私有成员变量和成员方法(二)

JAVA 通过反射获取公共和私有成员变量和成员方法(二),第1张

JAVA 通过反射获取公共和私有成员变量和成员方法(二)
      • 类对象文件
      • 1.通过反射获取类的所有的成员变量
      • 2.通过反射获取类的单个成员变量,并用反射给成员变量赋值
      • 3.通过反射获取类的单个成员方法,并用调用。

JAVA通过反射创建对象可以查看以下介绍。
JAVA通过反射来创建对象(一)

类对象文件
package com.csdn;

public class Student {
    private String name;
    private int age;
    public String height;
    protected int num;

    public Student() {
    }

    public void print1(){
        System.out.println("public print1");
    }

    private void print2(){
        System.out.println("private print2");
    }


    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", height='" + height + '\'' +
                ", num=" + num +
                '}';
    }
}
1.通过反射获取类的所有的成员变量
package com.csdn;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

public class reflecttest {
    public static void main(String[] args) throws ClassNotFoundException{
        // 1.首先选择获取Class类的对象的三种方式的一种获取类对象
        Class<?> c = Class.forName("com.csdn.Student");
        // 2.获取所有的公共的成员变量
        Field[] fields = c.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("--------------");
        // 3.获取所有成员变量,包括公共的和非公共的。
        Field[] f2 = c.getDeclaredFields();
        for (Field field : f2) {
            System.out.println(field);
        }
    }
}

2.通过反射获取类的单个成员变量,并用反射给成员变量赋值
package com.csdn;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

public class reflecttest {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        // 1.首先选择获取Class类的对象的三种方式的一种获取类对象
        Class<?> c = Class.forName("com.csdn.Student");
        // 2.获取单个公共的成员变量
        Field height = c.getField("height");
        // 3.获取单个私有的成员变量
        Field pri_name = c.getDeclaredField("name");

        // 获取无参构造创建对象
        Constructor<?> con = c.getConstructor();
        Student s = (Student) con.newInstance();

        // 因为pri_name为private的,所以要关闭访问检查
        pri_name.setAccessible(true);

        // 为 height 和 pri_name 赋值
        height.set(s, "198cm");
        pri_name.set(s, "张三");

        System.out.println(s);
        
    }
}

3.通过反射获取类的单个成员方法,并用调用。
package com.csdn;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class reflecttest {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {

        Class<?> c = Class.forName("com.csdn.Student");
        Method print1 = c.getDeclaredMethod("print1");
        Method print2 = c.getDeclaredMethod("print2");
        print2.setAccessible(true);

        Constructor<?> constructor = c.getConstructor();
        Object o = constructor.newInstance();
        print1.invoke(o); // 此处调用的是无参方法,所以invoke只有一个输入,如果调用有参,则为print1.invoke(o, 参数)
        print2.invoke(o);
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/756323.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-30
下一篇 2022-04-30

发表评论

登录后才能评论

评论列表(0条)

保存