前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过反射动态创建对象

通过反射动态创建对象

作者头像
高大北
发布2022-06-14 19:58:28
8830
发布2022-06-14 19:58:28
举报
文章被收录于专栏:java架构计划训练营

示🌰

  1. 通过Class类的getMethod(String name,Class...parameterTypes)方法取得一个Method对象,并设此方法操作时所需要的参数类型
  2. 之后使用Object invoke(Object obj,Object[] args)进行调用,并向方法中传递要设置的obj对象的参数信息
    • Object对应原方法的返回值,若原方法无返回值,此时返回null
    • 若原方法为静态方法,此时形参Object obj可为null
    • 若原方法形参列表为空,则Object[] argsnull
    • 若原方法声明为private,则需要在调用此invoke()方法前,显式调用方法对象的setAccessible(true)方法,将可访问private的方法
    • MethodFieldContructor对象都有setAccessible()方法
    • setAccessible作用是启动和禁用访问安全检查的开关
    • 参数值为true则指示反射的对象在使用时应该取消Java语言访问检查
      • 提高反射效率。如果代码中必须用反射,而该句代码需要频繁的被调用,那么设置为true
      • 使得原本无法访问的私有成员也可以访问
    • 参数值为false则指示反射的对象应该实施Java语言访问检查
代码语言:javascript
复制
public class Test09 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        //获得Class对象
        Class<?> aClass = Class.forName("com.fl.reflection.User");

        //构造一个对象
        User user = (User) aClass.newInstance(); //本质是调用了User的无参构造器
        System.out.println(user);
        //通过构造器创建对象
        Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class, int.class, int.class);
        User user1 = (User) declaredConstructor.newInstance("小白", 001, 18);
        System.out.println(user1);

        //通过反射调用普通方法
        User user2 = (User)aClass.newInstance();
        //通过反射获取一个方法
        Method setName = aClass.getDeclaredMethod("setName", String.class);
        setName.invoke(user2,"AAA");
        System.out.println(user2.getName());

        //通过反射操作属性
        User user3 = (User)aClass.newInstance();
        Field name = aClass.getDeclaredField("name");
        //不能直接操作私有属性,我们需要关闭程序的安全检测, 属性或方法的setAccessible(true)
        name.setAccessible(true);
        name.set(user3,"BBB");
        System.out.println(user3.getName());
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 示🌰
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档