java-反射

2024-04-14 15:16:10 浏览数 (1)

代码语言:java复制
package com.test;


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

public class Apple {
    private int price;

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }
    public static void main(String[] args) throws Exception {
        /**
         * 正常调用
         * 正射:已经知道类初始化的对象是什么,可以通过new直接初始化对象
         */
        Apple apple = new Apple();
        apple.setPrice(5);
        System.out.println("com.test.Apple Price:" apple.getPrice());
        /**
         * 反射调用
         * 反射:一开始不知道类、初始化的对象,无法使用new创建;只能使用JDK提供的反射API反射调用
         *      反射就是在类运行时,才知道操作的类、对象是什么,并可以通过运行时的类反向获取类的完整构造,并调用其变量、方法来完成一些动作。例如创建新对象
         */
        /**
         * 例如:只知道类的路径,类的变量、方法、构造函数等一概不知,通过该路径来反向获取类的信息来创建对象
         * 前提:只知道类的路径,其他啥都不知道,才能体现出反射的价值
         */
        Class clz = Class.forName("com.test.Apple");
        /**
         * 通过反射获取类的方法、变量、构造函数
         */
        Method[] methods = clz.getDeclaredMethods();
        Field[] fields =clz.getDeclaredFields();
        Constructor[] constructors = clz.getConstructors();
        /**
         * 通过反射获取的类信息,构造新对象
         */
        Constructor appleConstructor = clz.getConstructor();
        Method setPriceMethod = clz.getMethod("setPrice", int.class);
        Object appleObj = appleConstructor.newInstance();
        setPriceMethod.invoke(appleObj,14);
        Method getPriceMethod = clz.getMethod("getPrice");
        System.out.println("Apple Price:" getPriceMethod.invoke(appleObj));

    }
}

############################
com.test.Apple Price:5
Apple Price:14

0 人点赞