反射-常用API

本文介绍了Java反射机制,包括如何获取Class对象、Field、Method和Constructor等API的使用,并通过一个具体的Employee类展示了如何通过反射操作对象属性和方法。在测试代码中,创建了Employee对象,修改了其name和age属性,并调用了toString方法,展示了反射在实际编程中的应用。
摘要由CSDN通过智能技术生成

反射

反射是指:在运行期间可以知道一个对象的所有信息

1 反射常用API

1.1 获取反射中的Class对象

(1)通过类的 全路径字符串 获取Class,例如:

Class clz = Class.forName("java.lang.String");

(2)使用 类.class 方法,例如:

String.class

(3)通过 对象.getClass() 方法,例如:

String string = "hello world";
Class clz = string.getClass();

1.2 Class常用API

(1) Field[] getFields()
返回这个类或其超类的公共字段的Field对象数组。如果Class对象描述的是基本类型或者数组类型,将返回一个长度为0的数组。
(2) Field[] getDeclaredFields()
返回这个类的全部字段对应的Field对象数组。如果Class对象描述的是基本类型或者数组类型,将返回一个长度为0的数组。
(3)Field getField(String name)
返回指定名称的Field。如果不存在对应名称的字段,则抛出异常 NoSuchFieldException
(4)Field getDeclaredField(String name)
返回指定名称的Field。如果不存在对应名称的字段,则抛出异常 NoSuchFieldException
(5) Method[] getMethods()
返回所有的公共方法,包括从超类继承来的公共方法。
(6) Method[] getDeclaredMethods()
返回这个类或者接口的所有方法,但是不包括从超类继承的方法。
(7) Constructor[] getConstructors()
返回这个类的公共构造方法。
(8) Constructor[] getDeclaredConstructors()
返回这个类的全部构造方法。
(9) String getPackageName
得到包含这个类型的包的包名。如果该类是一个数组类型,则返回元素类型所属的包。如果是基本数据类型,则返回 “java.lang”。

1.3 程序实践

测试类:

@Data
public class Employee {

    private int id;
    private String name;
    private int age;

    public Employee(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Employee() {
    }
}

测试代码:

@Test
    public void test3() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException {
        // 获得类
        Class aClass = Class.forName("com.lqk.entity.Employee");
        Employee employee = (Employee) aClass.newInstance();
        System.out.println(employee.toString());
        // 获得属性,设置为可访问,设置value
        Field name = aClass.getDeclaredField("name");
        name.setAccessible(true);
        name.set(employee, "Tom");
        Field age = aClass.getDeclaredField("age");
        age.setAccessible(true);
        age.set(employee, 100);
        System.out.println(employee.toString());
        // 获取方法, 执行方法
        Method toString = aClass.getMethod("toString");
        String employeeString = (String) toString.invoke(employee);
        System.out.println(employeeString);
    }

程序输出:

Employee(id=0, name=null, age=0)
Employee(id=0, name=Tom, age=100)
Employee(id=0, name=Tom, age=100)
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值