Java反射机制的运用

一个关于“反射”的练习

举例一个学生类

点击查看【Student.java】代码
package com.unit13.pojo;

public class Student {
	private int id;
	private String name;
	private int age;
	public static String info = "能访问的公有属性";

	public void study() {
		System.out.println(this.name+"在认真学习!");
	}
	
	public void show() {
		System.out.println(this.name+"今年"+this.age+"岁了!");
	}
	
	public Student(int id, String name, int age) {
		this.id = id;
		this.name = name;
		this.age = age;
	}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	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;
	}
	
	
}

围绕该学生类逐步掌握“反射”的知识点

点击查看【Test.java】代码
package com.unit13.test;// 包名

import com.unit13.pojo.Student;// 学生类

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

/**
 * @Title: Java反射机制的运用,掌握:1、Constructor;2、Method;3、Field;
 * @Description: 融会贯通-练习:
 * 1、获取类的信息;
 * 2、用反射机制获取类的指定构造方法并调用该构造方法;
 * 3、用反射机制获取指定方法并调用该方法;
 * 4、用反射机制获取指定属性。
 * @author: TabKey9
 * @CreateDate: 2022.3.9 9:30
 */
public class Test {
    public static void main(String[] args) throws Exception {
        // 获取类的信息
        Class obj = Class.forName("com.unit13.pojo.Student");// 根据类名获得类信息
//        System.out.println(obj);// 输出:class com.unit13.pojo.Student

        // 先看看类中有哪些构造方法,获取类的所有构造方法
        Constructor[] cons = obj.getConstructors();
        for (Constructor i : cons) {
//            System.out.println(i);// 输出:public com.unit13.pojo.Student(int,java.lang.String,int)
        }

        // 用反射机制调用构造方法
        // 1、获取指定构造方法
        Constructor con = obj.getDeclaredConstructor(int.class,String.class,int.class);
        // 2、调用构造方法
        Student t =(Student) con.newInstance(99,"李四",82);// 用 newInstance() 调用
//        System.out.println(t.getName());// 输出:李四

        // 先看看类中有哪些用public修饰的方法、以及继承自父类的方法
//        Method[] ms = obj.getMethods();
        // 另一种,获得类中所有方法,包括私有的,但不包括父类的方法
        Method[] ms = obj.getDeclaredMethods();
        for (Method i : ms) {
//            System.out.println(i);
        }

        // 获取类中指定的方法
        Method m1 = obj.getDeclaredMethod("show");
//        System.out.println(m1);// 输出:public void com.unit13.pojo.Student.show()
        // 上面 m1 获得了指定的方法,再用 invoke(); 该方法
//        m1.invoke(t);// 相当于执行了 show(); 输出:李四今年82岁了!

        // 老规矩,不知道有什么属性,先看看类中有什么属性,再做打算
//        Field[] fs = obj.getFields();// 全是私有的属性,这个 getFields();获取不到
        Field[] fs2 = obj.getDeclaredFields();// 得到类中所有的属性,包括私有的
        for (Field i : fs2) {
//            System.out.println(i);// 输出:(私有的:id、name、age)
        }

        // 访问私有属性.  提前说结论:访问私有属性,只能拿到它的信息,拿不到它的值,如果想拿到它的值,得改成公有的属性。
        Field f1 = obj.getDeclaredField("name");// 可以得到私有属性的信息,但不能访问它的值
//        System.out.println(f1);// private java.lang.String com.unit13.pojo.Student.name
//        String s1 = (String) f1.get(String.class);
//        System.out.println(s1);// 报错信息: .Test can not access a member of class com.unit13.pojo.Student with modifiers "private"
                                    // 翻译:Test类 不能访问 Student类 的私有成员变量
        Field f2 = obj.getDeclaredField("info");// 刻意在 Student类中定义了一个公有的属性(info)用来验证公有的属性能被访问
        String s2 = (String) f2.get(String.class);// get()得到的是 Object ,用了强制转换类型 String
//        System.out.println(s2);// 输出:能访问的公有属性

    }
}

运行
全部输出的话有点乱,全部输出都注释掉了,想看哪个自己开哪个!

posted @ 2022-03-09 15:40  TabKey9  阅读(19)  评论(0编辑  收藏  举报