反射学习笔记

简单使用

Apple.java

public class Apple{
    private String name;
    private float price;

    public Apple() {
        
    }
    
    public String getName() {
        return name;
    }

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

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }
    @Override
    public String toString(){
        return String.format("Name = %s ; Price = %s",name, price);
    }
}

正常创建对象并调用方法

		// 正常调用方法
        Apple apple = new Apple();
        apple.setName("苹果");
        apple.setPrice(10);
        System.out.println(apple.toString());

Name = 苹果 ; Price = 10.0

获取类的 Class 对象实例

使用Class.forName(),传入class包路径

	Class<?> clazz = (Class<?>) Class.forName("study.Apple");

根据Class对象获取实例

	Apple apple2 = (Apple) clazz.newInstance();

根据 Class 对象实例获取 Constructor 对象

	Constructor[] constructors = clazz.getConstructors();

使用 Constructor 对象的 newInstance 方法获取反射类对象

		// Apple有一个无参构造函数
        Apple apple3 = (Apple) constructors[0].newInstance();

通过反射调用方法

获取方法的 Method 对象

	// 参数[方法名,<paramClasses>]
	Method setP = clazz.getMethod("setPrice", float.class);

利用 invoke 方法调用方法

	 	// 反射调用方法
        Method setP = clazz.getMethod("setPrice", float.class);
        // 反射修改价格
        setP.invoke(apple2,8);
        Method method = clazz.getMethod("toString");
        // 有返回值
        String out = (String) method.invoke(apple2);
        System.out.println(out);

反射常用API

获取反射中的Class对象

在反射中,要获取一个类或调用一个类的方法,我们首先需要获取到该类的 Class 对象。

在 Java API 中,获取 Class 类对象有三种方法:

第一种,使用 Class.forName 静态方法。当你知道该类的全路径名时,你可以使用该方法获取 Class 类对象。

	Class clazz = Class.forName("study.Apple");

第二种,使用 .class 方法。

	// 适用于编译前知道类
	Class<Apple> clzz = Apple.class;

第三种,使用类对象的 getClass() 方法。

     Class<?> clzz = apple.getClass();

通过反射创建类对象

通过反射创建类对象主要有两种方式:通过 Class 对象的 newInstance() 方法、通过 Constructor 对象的 newInstance() 方法。

  • 第一种:通过 Class 对象的 newInstance() 方法。

  • 第二种:通过 Constructor 对象的 newInstance() 方法

	// 通过Class获取
	Apple apple = clazz.newInstance();
	// Apple有一个无参构造函数
    Apple apple3 = (Apple) constructors[0].newInstance();

通过反射获取类属性、方法、构造器

我们通过 Class 对象的 getFields() 方法可以获取 Class 类的属性,但无法获取私有属性。

	Class clazz = Apple.class;
	// 获取属性
	Field[] fields = clazz.getFields();
	for (Field field : fields) {
	    System.out.println(field.getName());
	}
	// 获取方法
	Method setP = clazz.getMethod("setPrice", float.class);
	
	// 获取所有构造器
	Constructor[] constructors = clazz.getConstructors();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值