ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

十一、动态创建对象

2022-06-12 02:00:22  阅读:143  来源: 互联网

标签:十一 调用 Object 创建对象 clazz User 动态 方法 Class


创建类的对象:调用Class对象的newlnstance()方法

  1. 类必须有一个无参数的构造器。
  2. 类的构造器的访问权限需要足够


思考:难道没有无参的构造器就不能创建对象了吗?并非如此,因此,只要在操作的时候明确的调用类中的构造器,并将参数传递进去之后,就可以实例化操作。

步骤如下:

  1. 通过Class类的getDeclaredConstructor(Class ... parameterTypes)取得本类的指定形参类型的构造器
  2. 向构造器的形参中传递一个对象数组进去,里面包含了构造器中所需的各个参数。
  3. 通过Constructor实例化对象

 

通过反射,调用类中的方法,通过Method类完成。

  1. 通过Class类的getMethod(String name,Class...parameterTypes)方法取得一个Method对象,并设置此方法操作时所需要的参数类型。
  2. 之后使用Object invoke(Object obj, Object[] args)进行调用,并向方法中传递要设置的obj对象的参数信息。

操作如下:object invoke(Object obj, Object ... args)

  • Object对应原方法的返回值,若原方法无返回值,此时返回null
  • 若原方法若为静态方法,此时形参Object obj可为null若原方法形参列表为空,则Object[] args为null
  • 若原方法声明为private,则需要在调用此invoke()方法前,显式调用方法对象的setAccessible(true)方法,将可访问private的方法。

关于:setAccessible

  • Method和Field、Constructor对象都有setAccessible()方法。
  • setAccessible作用是启动和禁用访问安全检查的开关。
  • 参数值为true则指示反射的对象在使用时应该取消Java语言访问检查。
    • 提高反射的效率。如果代码中必须用反射,而该句代码需要频繁的被调用,那么请设置为true。
    • 使得原本无法访问的私有成员也可以访问
  • 参数值为false则指示反射的对象应该实施Java语言访问检查
public class Demo08 {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        Class clazz = Class.forName("com.zx.reflection.User");

        //1. 获取实例
        //此方式必须要求有无参构造
        User user1 = (User) clazz.newInstance();
        System.out.println(user1);

        //获取构造器,通过构造器进行实例化
        Constructor constructor = clazz.getConstructor(Integer.class, String.class, Integer.class);
        User user2 = (User) constructor.newInstance(1, "zs", 23);
        System.out.println(user2);


        //2. 调用方法
        User user3 = (User) clazz.newInstance();
        Method setName = clazz.getMethod("setName", String.class);
        setName.invoke(user3,"zx");
        System.out.println(user3);


        //3. 获取属性
        User user4 = (User) clazz.newInstance();
        Field name = clazz.getDeclaredField("name");
        //关闭安全检查,即使其可以访问
        name.setAccessible(true);
        name.set(user4,"ls");
        System.out.println(user4);
    }
}

 

标签:十一,调用,Object,创建对象,clazz,User,动态,方法,Class
来源: https://www.cnblogs.com/epiphany8/p/16367271.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有