代码语言: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