zoukankan      html  css  js  c++  java
  • newInstance() 的参数版本与无参数版本

    通过反射创建新的类示例,有两种方式: 
    Class.newInstance() 
    Constructor.newInstance() 

    以下对两种调用方式给以比较说明: 
    Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数; 
    Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数。 

    Class.newInstance() 要求被调用的构造函数是可见的,也即必须是public类型的
    Constructor.newInstance() 在特定的情况下,可以调用私有的构造函数,需要通过setAccessible(true)实现。

    下面是两种方式:

    package com.reflect;
    import java.lang.reflect.Constructor;
    
    class TestB
    {
        public  TestB()
        {
            System.out.println("Test A");
        }
        //设置构造方法私有
        private TestB(int a,String b)
        {
            System.out.println("Test parames");
        }
    }
    public class Test {
        
        public static void main(String []args) throws Exception
        {
            Test b=new Test();
            Class c=Class.forName("com.reflect.TestB");
            //无参数
            TestB b1=(TestB) c.newInstance();
            //有参数需要使用Constructor类对象
            //这种方式和下面这种方式都行,注意这里的参数类型是 new Class[]
            //Constructor ct=c.getDeclaredConstructor(int.class,String.class);
            Constructor ct=c.getDeclaredConstructor(new Class[]{int.class,String.class});
            ct.setAccessible(true);
            //这种方式和下面这种方式都可以:注意这里的参数类型是 new Object[]
            //TestB b2=(TestB) ct.newInstance(1,"2");
            TestB b2=(TestB) ct.newInstance(new Object[] {1,"2"});
        }
    }

    运行结果:

    Test A
    Test parames
  • 相关阅读:
    异常
    动态链接库与静态链接库的区别
    OpenBLAS 安装与使用
    Eigen 优化技巧
    C++读取保存为二进制的 numpy 数组
    Sublime Text Windows版使用Conda环境
    Repeater 时间格式化
    C#与js的各种交互
    js 实现精确加减乘除
    常用正则表达式
  • 原文地址:https://www.cnblogs.com/alsf/p/8727660.html
Copyright © 2011-2022 走看看