Java通过反射获取类的构造方法、属性、成员方法

目录

一、实体类准备

二、获取Class对象(三种方法)

1、通过Class.forName("全类名")

2、通过类名.class

3.通过对象.getClass

三、获取构造方法

四、通过构造方法创建对象


一、实体类准备

package ReflexStudy;

public class Student {
    private String name;
    private int age;
    public Student() {

    }
    public Student(String name){
        this.name = name;
    }
    protected Student(int age){
        this.age = age;
    }
    private Student(String name, int age){
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    private String study(String book){
        System.out.println("i am study..." + book);
        return "i am ok";
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

二、获取Class对象(三种方法)

1、通过Class.forName("全类名")

    public static void main(String[] args) throws ClassNotFoundException {
        Class aClass = Class.forName("ReflexStudy.Student");
        System.out.println(aClass);
    }

2、通过类名.class

    public static void main(String[] args) throws ClassNotFoundException {
        Class aClass = Student.class;
        System.out.println(aClass);
    }

3.通过对象.getClass

    public static void main(String[] args) throws ClassNotFoundException {
        Student student = new Student();
        System.out.println(student.getClass());
    }

三、获取构造方法
 

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
        Class aClass = Class.forName("ReflexStudy.Student");
        System.out.println(aClass.getConstructor());//public ReflexStudy.Student()
        for (Constructor constructor : aClass.getConstructors()) {
            System.out.println(constructor);
        }//public ReflexStudy.Student(java.lang.String)
        // public ReflexStudy.Student()
        System.out.println(aClass.getDeclaredConstructor(String.class));//public ReflexStudy.Student(java.lang.String)
        for (Constructor declaredConstructor : aClass.getDeclaredConstructors()) {
            System.out.println(declaredConstructor);
        }//private ReflexStudy.Student(java.lang.String,int)
        //protected ReflexStudy.Student(int)
        //public ReflexStudy.Student(java.lang.String)
        //public ReflexStudy.Student()
    }

通过构造方法创建对象

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        Class aClass = Class.forName("ReflexStudy.Student");
        Constructor constructor = aClass.getDeclaredConstructor(String.class, int.class);//获取有两个参数的构造方法
        System.out.println(constructor.getModifiers());//2 代表获取的构造方法由private修饰
        constructor.setAccessible(true); //取消权限校验  如果不是private修饰的构造方法则不许要这句
        Student student = (Student)constructor.newInstance("张三", 18);
        System.out.println(student);//Student{name='张三', age=18}
    }

 四、获取属性

    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
        Class aClass = Class.forName("ReflexStudy.Student");
        for (Field field : aClass.getDeclaredFields()) {
            System.out.println(field);
        }//private java.lang.String ReflexStudy.Student.name
        //private int ReflexStudy.Student.age
        Field name = aClass.getDeclaredField("name");//注意这里不能使用getField因为name被private修饰
        System.out.println(name);//private java.lang.String ReflexStudy.Student.name
    }

 通过反射获取对象name属性和修改对象name属性

    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        Class aClass = Class.forName("ReflexStudy.Student");
        Field name = aClass.getDeclaredField("name");
        Student student = new Student("张三");
        name.setAccessible(true);//原因与构造函数相同 name由private修饰
        Object o = name.get(student);//获取对象name
        System.out.println(o);//张三
        name.set(student, "李四");//修改对象name
        System.out.println(student);//Student{name='李四', age=0}
    }

五、获取成员方法

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
        Class aClass = Class.forName("ReflexStudy.Student");
        for (Method declaredMethod : aClass.getDeclaredMethods()) {
            System.out.println(declaredMethod);
        }//public void ReflexStudy.Student.setAge(int)....
        Method getName = aClass.getDeclaredMethod("getName");
        System.out.println(getName);//public java.lang.String ReflexStudy.Student.getName()
    }

调用成员方法

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class aClass = Class.forName("ReflexStudy.Student");
        Method study = aClass.getDeclaredMethod("study", String.class);
        Student student = new Student();
        study.setAccessible(true);
        System.out.println(study.invoke(student, "鲁滨逊漂流记"));//i am study...鲁滨逊漂流记
                                                                //i am ok
    }

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
获取Student类的所有构造方法成员方法成员变量,可以使用Java反射机制。下面是示例代码: ```java import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Main { public static void main(String[] args) { Class<Student> studentClass = Student.class; // 获取所有构造方法 Constructor<?>[] constructors = studentClass.getConstructors(); System.out.println("Constructors:"); for (Constructor<?> constructor : constructors) { System.out.println(constructor); } // 获取所有成员方法 Method[] methods = studentClass.getMethods(); System.out.println("\nMethods:"); for (Method method : methods) { System.out.println(method); } // 获取所有成员变量 Field[] fields = studentClass.getDeclaredFields(); System.out.println("\nFields:"); for (Field field : fields) { System.out.println(field); } } } class Student { private String name; private int age; private int classId; private String sex; private int score; public Student(String name, int age, int classId, String sex, int score) { this.name = name; this.age = age; this.classId = classId; this.sex = sex; this.score = score; } public String getName() { return name; } public int getAge() { return age; } public int getClassId() { return classId; } public String getSex() { return sex; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } } ``` 输出结果: ``` Constructors: public Student(java.lang.String,int,int,java.lang.String,int) Methods: public int Student.getAge() public void Student.setScore(int) public int Student.getClassId() public int Student.getScore() public java.lang.String Student.getSex() public java.lang.String Student.getName() public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException ... Fields: private java.lang.String Student.name private int Student.age private int Student.classId private java.lang.String Student.sex private int Student.score ``` 注意:这里的示例代码使用了`Student`类来表示学生,你可以根据实际情况进行调整。`getConstructors()`方法获取的是所有公共构造方法,`getMethods()`方法获取的是所有公共成员方法,`getDeclaredFields()`方法获取的是所有成员变量(包括私有成员变量)。如果需要获取非公共的构造方法方法或变量,可以使用相应的方法,如`getDeclaredConstructors()`、`getDeclaredMethods()`和`getDeclaredFields()`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值