1. 程式人生 >實用技巧 >其它 >Java實現反射的方式和反射的基本應用

Java實現反射的方式和反射的基本應用


準備

先準備一個實體類User.java:

package com.example.reflect;

public class User {
    private String id;
    public String name;
    private String telephone;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }
}

獲取Class物件方式

反射第一步:獲取某個類的Class物件————有3種獲取方式

  • 法1:Class<?> clazz = Class.forName(“完整類路徑”);

Class<?> clazz1 = Class.forName(“com.example.reflect.User”);

  • 法2:Class<?> clazz = 類名.class;

Class<?> clazz2 = User.class;

  • 法3:Class<?> clazz = 類的例項名.getClass();

User user = new User();
Class<?> clazz3 = user.getClass();

程式碼示例

接下來使用User實體類對反射實現方法進行演示:

package com.example.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class ReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        //===============反射第一步:獲取某個類的Class物件————有3種獲取方式

        //********法1:Class<?> clazz = Class.forName("完整類路徑");
        Class<?> clazz1 = Class.forName("com.example.reflect.User");

        //********法2:Class<?> clazz = 類名.class;
        Class<?> clazz2 = User.class;

        //********法3:Class<?> clazz = 類的例項名.getClass();
        User user = new User();
        Class<?> clazz3 = user.getClass();






        //===============獲取某個類的屬性(包含屬性的 修飾符、型別、屬性名 等資訊)
        //*** 1.獲取所有屬性
        Field[] fields = clazz1.getDeclaredFields();

        //*** 2.獲取特定屬性名的欄位物件————方便對特定值重新賦值
        Field nameField = clazz1.getField("name");
        //獲取屬性的修飾符、型別、名稱
        String attributeModifier = Modifier.toString(nameField.getModifiers());
        Class<?> attributeType = nameField.getType();
        String attributeName = nameField.getName();

        //對name重新賦值——先建立例項物件,再賦值
        User user1 = (User)clazz1.newInstance();
        nameField.set(user1,"神樂");






        //===============獲取某個類的方法(包含方法的 修飾符、返回型別、方法名 等資訊)
        //*** 1.獲取所有方法
        Method[] methods = clazz1.getDeclaredMethods();

        //*** 2.獲取【特定方法名,特定引數型別】的方法物件————方便呼叫特定方法
        Method setNameMethod = clazz1.getMethod("setName",String.class);

        //呼叫特定方法——先建立例項物件,再呼叫方法
        setNameMethod.invoke(user1,"新巴基");

    }
}