reflect操作对象及方法

本文详细介绍了如何使用Java的反射API来操作对象,包括获取反射对象、设置和获取属性、调用方法以及使用构造方法创建实例。强调了在操作私有成员时设置Accessible的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章主要是写一下关于如何用reflect创建操作对象,以及操作各种方法。

一、获取反射对象

(1)获取反射入口

Class<?> preClass=Class.forName("reflect.People");

(2)获取反射对象并转换成你自己所需要的

People p1=(People)pre.newInstance();
//这里p1就是获取的对象

(3)设置对象的属性

p1.setName("张三");
p1.setId(23);

(4)总代码展示

注意:instance默认是Object类型,所以可以将他转换成你所需要的任意类型

        通常在拿reflect入口的时候,推荐Class.forName();

//1.获取反射对的实例,并操作对象
    public static void Demo1() throws IllegalAccessException, InstantiationException {
        Class<?> perClass=null;
        //拿入口推荐Class.forName()
        try {
            perClass=Class.forName("relfect.Person");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        //instanse默认是Object类型 将他转换成你所需要的类型
        Person per =(Person)perClass.newInstance();
        per.setName("张三");
        per.setAge(23);
        System.out.println(per.getName()+","+per.getAge());
    }

二、操作对象的属性

(1)获取入口 Class.forName();

(2)获取对象 .newInstance();

(3)通过.getDaclaredField()获取所需属性,在这里我拿id这个属性

Field idField=perClass.getDeclaredField("id");
//idField相当于id这个属性

(4)因为我的id属性为private ,所有这里我需要暂时打开权限 .setAccessible(true);

idField.setAccessible(true);

(5)将权限打开后,在设置属性 .set(属性的对象,值)

idField.set(per,1);

(6)总结代码

   public class d{
        public static void main(String[] args){
         Class<?> perClass=null;
        //拿入口推荐Class.forName()
        try {
            perClass=Class.forName("relfect.Person");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        Person per =(Person)perClass.newInstance();
        Field idField=perClass.getDeclaredField("id");
        //要访问的事private修饰的id,但是private是私有的
        //修改属性访问权限
        //使用反射时候 因为访问修饰符造成异常 可以通过 属性/方法.setAccessible()
        idField.setAccessible(true);//把权限打开
        idField.set(per,1);  //之前per.setId(1);  setId() 相当于idFiled
        System.out.println(per.getId());
    }

}

三、操作方法

(1)获取你所需要的方法 .getDeclaredMethod(方法名,参数类型);

Method method =perClass.getDeclaredMethod("privateMethod",null);

(2)因为方法是private所以需要打开权限 用.setAccessible()

method.setAccessible(true);

(3)调用方法用 .invoke(对象,方法的参数)

method.invoke(per,null);

(4)总结代码

//调用无参的方法       
Method method=perClass.getDeclaredMethod("privateMethod",null);
method.setAccessible(true);
method.invoke(per,null);//方法的调用通过invoke()方法 per是对象

//调用有参数的方法
Method method2=perClass.getDeclaredMethod("privateMethod2",String.class);
method2.setAccessible(true);
method2.invoke(per,"张三");

四、操作构造方法

无论拿什么方法都是通过反射入口拿的perClass

//获取公共构造方法 .getConstructors()

Constructors<?>[] constructors=perClass.getConstructors();

//获取全部构造方法.getDeclaredConstructors()

Constructor<?>[] constructors=perClass.getDeclaredConstructors();

//获取指定构造方法 .getConstructor(返回值类型.class)

Constructor<?> constructor= perClass.getConstructor(int.class);

//获取指定私有构造方法 .getDeclaredConstructor()

Constructor<?> constructor1=perClass.getDeclaredConstructor(String.class);

五、通过构造方法拿对象

//获取有参的构造方法 .getConstructor(Integer.class) ,并拿对象

Construtors<?> constructor=perClass.getConstructor(Integer.class)
People p1=(People)constructor.newInstance();

//获取无参构造方法 .getConstructor(),并拿对象

Constructor<?> constructor1=perClass.getConstructor();
Person instance=(Person) constructor1.newInstance();
//因为constructor是无参构造 不需要传值里面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱穿风衣的土豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值