package com.example.demo.test;
import java.lang.reflect.Constructor;
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 {
// 正常调用,创建apple对象,给定apple对象价格
Apple apple = new Apple();
apple.setPrice(3);
System.out.println("Apple Price:"+apple.getPrice());
// 使用反射调用
// 获取类的Class对象实例
Class clz = Class.forName("com.example.demo.test.Apple");
/**
* 获取反射中的Class对象
*
* 方式一:使用Class.forName静态方法
* Class clz = Class.forName("com.example.demo.test.Apple");
*
* 方式二: 使用.class方法
* Class clz = Apple.class;
*
* 方式三: 使用类对象的 getClass() 方法。
* Apple a = new Apple();
* Class clz = a.getClass();
*/
// 根据Class对象实例获取Constructor对象
Constructor appleConstructor = clz.getConstructor();
// 使用Constructor对象的newInstance方法获取反射类对象
Object appleObj = appleConstructor.newInstance();
/**
* 通过反射创建类对象
*
* 方式一:通过Class对象的newInstance()
* Class clz = Apple.class;
* Apple a = (Apple)clz.newInstance();
*
* 方式二:通过Constructor对象的newInstance()
* Class clz = Apple.class;
* Constructor c = clz.getConstructor();// 无参构造器
* Apple apple = (Apple)c.newInstance();
* Constructor c2 = clz.getConstructor(String.class, int.class);// 有参构造器
* Apple apple = (Apple)c2.newInstance("红富士", 15);
*/
// 获取方法的Method对象
Method setPriceMethod = clz.getMethod("setPrice", int.class);
Method getPriceMethod = clz.getMethod("getPrice");
/**
* 通过反射获取类属性、方法、构造器
* Class clz = Apple.class;
* Field[] fs = clz.getMethods(); // 不能获取私有方法
* Field[] f2s = clz.getDeclaredFields(); // 获取所有方法包括私有方法
* for(Field f : fs){
* System.out.println(f.getName());
* }
*/
// 使用invoke调用方法
setPriceMethod.invoke(appleObj, 14);
System.out.println("Apple Price:" + getPriceMethod.invoke(appleObj));
}
}
反射使用
最新推荐文章于 2023-11-05 11:21:34 发布