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
  • 相关阅读:
    Disruptor-NET和内存栅栏
    SSDB:高性能数据库服务器
    PostgreSQL配置优化
    ADO.NET的弹性连接控制[ADO.NET idle connection resiliency]
    2013年度IT博客大赛跻身10强
    MongoDB 聚合管道(Aggregation Pipeline)
    验证码类库CaptchaMvc
    AngularJS SPA Template For Visual Studio
    .NET 4.0 版本号
    利用SSH Filesystem实现远程文件系统
  • 原文地址:https://www.cnblogs.com/alsf/p/8727660.html
Copyright © 2011-2022 走看看