Index / Java

Java 反射实例操作

原文:https://ichochy.com/posts/java/20200823.html

反射可以在代码运行时,动态的获取对象、调用方法、设置属性。动态操作,降低代码偶合性,提高灵活度。其JDBC库就是通过反射加载。

实例操作

以操作User对象为例:

/*
 * File:User.java
 * User:iChochy
 * URL:https://ichochy.com
 * Copyright (c) 2020
 * Date:2020/08/31 10:18:31
 */

package com.ichochy.example;

public class User {
    private String name = "iChochy";
    private int age = 32;
    private String url = "https://ichochy.com";

    public void display(){
        System.out.println("Name:"+name);
        System.out.println("Age:"+age);
        System.out.println("URL:"+url);
    }
}

正常调用

User user = new User();
user.display();

获取对象

类动态获取

//获取类
Class<?> clazz = User.class;
//获取对象
Object obj = clazz.newInstance();

类路径获取

//获取类
Class<?> clazz = Class.forName("com.ichochy.example.User");
//获取对象
Object obj = clazz.newInstance();

获取属性

获取全部

Field[] fields = clazz.getDeclaredFields();
for (Field field: fields) {
    System.out.println(field.getName());//name、age、url
}

属性名获取

Field field = clazz.getDeclaredField("age");
System.out.println(field.getName());//age

设置属性

Object obj = clazz.newInstance();
Field field= clazz.getDeclaredField("age");//获取私用属性
field.setAccessible(true);//设置反射访问权限检查
System.out.println(field.get(obj)); //32
field.set(obj,18);//设置属性
System.out.println(field.get(obj));//18

获取方法

获取全部

Method[] methods = clazz.getMethods();
for(Method method:methods){
    System.out.println(method.getName()); //display
}

方法名获取

Method method = clazz.getMethod("display");
System.out.println(method.getName()); //display

调用方法

Object obj = clazz.newInstance();
Method[] methods = clazz.getMethods();
for(Method method:methods){
    //调用 display 方法
    if("display".equals(method.getName())){
        method.invoke(obj);
    }
}

方法名调用

Object obj = clazz.newInstance();
Method method = clazz.getMethod("display");
method.invoke(obj);