Java基础之反射机制

1.1什么是反射机制

反射机制是指在程序运行过程中,对任意一个类可以获得其所有的属性和方法,并且任意对象都能调用其任意方法。通过Java的反射机制可以动态获取类和对象的信息,以及动态调用对象的方法。

1.2反射的应用

当程序在编译期间无法预知该对象和类的真实信息,只能通过运行时信息来发现该对象和类的真实信息,这种情况下通常通过反射机制来获取。例如以下代码,persion对象的编译时类型为Person,运行时类型为Student,我们无法在编译时获取Student类中的定义方法。

Person person = new Student();

如果我们想获得Student类中定义的方法,我们可以采用Java的反射机制来获取。

1.3 Java的反射API

  • Class类:用于获取类的属性、方法等。
  • Field类:表示类的成员变量,用于get和set类中的属性值
  • Method类:用于获取方法的描述信息或执行某个方法
  • Constructor类:类的构造方法

1.4 反射的过程

  1. 获取类的Class对象
  2. 调用Class对象对应的类中定义的方法
  3. 使用反射API获取并调用类的属性和方法
Person person = new Person();
        Class clazz = Class.forName("reflection.Person");
//        Class clazz = Person.class;
//        Class clazz = person.getClass();

        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println("--------------------------------------------------------------------");

        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("--------------------------------------------------------------------");

        Constructor[] constructors = clazz.getDeclaredConstructors();
        Object o = null;
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
            o = constructor.newInstance();
        }
        System.out.println("--------------------------------------------------------------");

        Method setName = clazz.getMethod("setName", String.class);

        setName.invoke(o,"Java");

        Method getName = clazz.getMethod("getName");
        Object invoke = getName.invoke(o);
        System.out.println(invoke);
@Data
public class Person {
    private String name;
    private int age;
}

运行结果如下

public boolean reflection.Person.equals(java.lang.Object)
public java.lang.String reflection.Person.toString()
public int reflection.Person.hashCode()
public java.lang.String reflection.Person.getName()
public void reflection.Person.setName(java.lang.String)
public int reflection.Person.getAge()
public void reflection.Person.setAge(int)
protected boolean reflection.Person.canEqual(java.lang.Object)
--------------------------------------------------------------------
private java.lang.String reflection.Person.name
private int reflection.Person.age
--------------------------------------------------------------------
public reflection.Person()

--------------------------------------------------------------
Java

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值