GVKun编程网logo

Java:没有默认构造函数的class的newInstance(java没有可用的默认构造函数)

21

本文将带您了解关于Java:没有默认构造函数的class的newInstance的新内容,同时我们还将为您解释java没有可用的默认构造函数的相关知识,另外,我们还将为您提供关于***关于构造函数,默

本文将带您了解关于Java:没有默认构造函数的class的newInstance的新内容,同时我们还将为您解释java没有可用的默认构造函数的相关知识,另外,我们还将为您提供关于*** 关于构造函数,默认构造函数,构造函数的默认参数、android – 视图中没有默认构造函数、asp.net – Moq Parent没有默认构造函数.必须显式定义默认构造函数、asp.net – 使用MVC4的Autofac:控制器没有默认构造函数的实用信息。

本文目录一览:

Java:没有默认构造函数的class的newInstance(java没有可用的默认构造函数)

Java:没有默认构造函数的class的newInstance(java没有可用的默认构造函数)

我正在尝试为学生的作业构建一个自动测试框架(基于jUnit,但这并不重要)。他们将不得不为某些类创建构造函数,并为其添加一些方法。稍后,使用我提供的测试功能,他们将检查是否正常。

我想做的是 通过反思 创建一个我想测试的类的新实例。问题在于,有时 没有默认构造函数 。我不在乎,
我想创建一个实例并自己初始化实例变量 。有什么办法吗?很抱歉,如果以前已经有人问过这个问题,但我找不到任何答案。

提前致谢。

答案1

小编典典

调用Class.getConstructor(),然后Constructor.newInstance()传递适当的参数。样例代码:

import java.lang.reflect.*;public class Test {    public Test(int x) {        System.out.println("Constuctor called! x = " + x);    }    // Don''t just declare "throws Exception" in real code!    public static void main(String[] args) throws Exception {        Class<Test> clazz = Test.class;        Constructor<Test> ctor = clazz.getConstructor(int.class);        Test instance = ctor.newInstance(5);               }}

*** 关于构造函数,默认构造函数,构造函数的默认参数

*** 关于构造函数,默认构造函数,构造函数的默认参数

【自我总结】

1.默认构造函数不仅可以是无参的,也可以是有参的,但所有参数必须指定默认值。一个类只能有一个默认构造函数。

2.什么时候调用默认构造函数?

  a.声明类的对象时没有括号时。如:classA  objA;

  b.子类构造函数没有显式调用父类构造函数时

3.构造函数中的默认参数要从右向左指定。 

  classA(int a=0, int b){}; //错误

  classA(int a, int b=0){}; //正确

 

【转】C++调用父类的构造函数规则

构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。

如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。

构造原则如下:
1. 如果子类没有定义构造方法,则调用父类的无参数的构造方法。

2. 如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。

3. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数,则会调用父类的默认无参构造函数。

4. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构造函数。

5. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错(如果父类只有有参数的构造方法,则子类必须显示调用此带参构造方法)。

6. 如果子类调用父类带参数的构造方法,需要用初始化列表的方式。

结论:子类构造函数必须要调用父类的构造函数(无论显式还是隐式),本质原因在于继承的性质决定了必须先有父再有子!

 

【转】C++的默认构造函数与构造函数

1. 默认构造函数主要是用来完成如下形式的初始化的:

testClass classA; // 或者  testClass *classA = new testClass;

在这种情况下,如果没有提供默认构造函数,编译器会报错;

非默认构造函数在调用时接受参数,如以下形式:

testClass classA(12,''H''); //或者  testClass *classA = new testClass(12,''H'');

2. 如果程序猿没有定义任何构造函数,则编译器会自动定义默认构造函数,其形式如  testClass() {};   可以看出,编译器自动提供的默认构造函数是 啥也没有啊 ;

3. 定义默认构造函数有两种方式,如上述代码展示的,一是定义一个无参的构造函数,二是定义所有参数都有默认值的构造函数 ;

4. 注意:一个类只能有一个默认构造函数!也就是说上述两种方式不能同时出现,一般选择 testClass(); 这种形式的默认构造函数 ;

5. 只要程序猿定义了构造函数,编译器就不会再提供默认构造函数了,所以,程序猿最好再手动定义一个默认构造函数,以防出现 testClass a; 这样的错误。

#include <iostream>
#include <string.h>
using namespace std;
class A
{
public:
    A(int x):a(x){};
    void printA (void)
    {
        cout << "a = " << a << endl;
    }
private:
    int a;
};
class B: public A
{
public:
    B(int x=0, int y=0):A(x)
    {
        b = y;
    }
    void printB(void)
    {
        cout << "b = " << b << endl;
    }
private:
    int b;
};
int main()
{
    B obj(1,2);
    obj.printA();
    obj.printB();
    return 0;
}

 

android – 视图中没有默认构造函数

android – 视图中没有默认构造函数

我有一个使用扩展 android.view.View的类的问题,这很奇怪,因为我在两个不同的项目中做同样的事情,只有其中一个是这个问题.

这两个项目都有一个类,它说:公共类ClassName扩展了View.

但是对于其中一个,这一行用红色加下划线,给出的信息是

“There is no default constructor available in ‘android.view.View’ “

我不知道为什么一个人有这个问题而另一个没有.当然,它们不是同一个类,但它们都以相同的方式扩展View.我认为这将是一个常见的问题,但我没有通过谷歌搜索找到任何相关信息,所以我在这里问.感谢您提供任何帮助!

编辑:

这些评论让我再次检查,果然,带有错误的类没有在其类中定义构造函数.我觉得有趣的是,即使我去定义了一个构造函数,它仍然会给出相同的错误,直到我添加参数(Context context,AttributeSet attrs)并在构造函数中添加了一行’super(context,attrs)’.我添加了这些因为它们存在于工人类的构造函数中.所以工作版本是

public DrawingActivity(Context context,AttributeSet attrs) {
    super(context,attrs);
}

我的新问题是关于这究竟是什么.这是从没有错误的类中获取的,该版本最初是从教程中复制过来的,当时从未考虑过.

解决方法

删除没有参数的构造.

您的视图应该只有3个构造函数:

public DrawingActivity(Context context,attrs);

}

public DrawingActivity(Context context,AttributeSet attrs,int defStyle) {
    super(context,attrs,defStyle);

}
public DrawingActivity(Context context) {
    super(context);
}

关于这个构造函数,你可以阅读here.我只能提到defStyle:

The default style to apply to this view. If 0,no style will be applied (beyond what is included in the theme). This may either be an attribute resource,whose value will be retrieved from the current theme,or an explicit style resource.

asp.net – Moq Parent没有默认构造函数.必须显式定义默认构造函数

asp.net – Moq Parent没有默认构造函数.必须显式定义默认构造函数

我正在使用实体框架db第一种方法并生成edmx文件.

我试图在这里实现输入代码使用MOQ框架进行单元测试.

这是我的代码

[TestMethod]
    public void DeleteApplication()
    {
        var mockContext = new Mock<ARMSContext>();
        var data = GetMemoryApplications();
        var mockSet = new Mock<DbSet<Application>>();
        mockSet.As<IQueryable<Application>>().Setup(m => m.Provider).Returns(data.Provider);
        mockSet.As<IQueryable<Application>>().Setup(m => m.Expression).Returns(data.Expression);
        mockSet.As<IQueryable<Application>>().Setup(m => m.ElementType).Returns(data.ElementType);
        mockSet.As<IQueryable<Application>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());

        var test=appcontroller.Delete(1,1);

    }

我在调用mockSet.Object时得到Parent没有..异常.

你能解决这个例外吗?

解决方法

根据您提供的内容,我无法看到您如何使用Mock< DbSet< Application>>,以及Mock< ARMSContext>.

以下是从MSDN“Testing with a mocking framework (EF6 onwards)”给出的示例,它将DbSet挂钩到Context:

[TestMethod]
    public void GetAllBlogs_orders_by_name()
    {
        var data = new List<Blog>
        {
            new Blog { Name = "BBB" },new Blog { Name = "ZZZ" },new Blog { Name = "AAA" },}.AsQueryable();

        var mockSet = new Mock<DbSet<Blog>>();
        mockSet.As<IQueryable<Blog>>().Setup(m => m.Provider).Returns(data.Provider);
        mockSet.As<IQueryable<Blog>>().Setup(m => m.Expression).Returns(data.Expression);
        mockSet.As<IQueryable<Blog>>().Setup(m => m.ElementType).Returns(data.ElementType);
        mockSet.As<IQueryable<Blog>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());

        var mockContext = new Mock<BloggingContext>();
        mockContext.Setup(c => c.Blogs).Returns(mockSet.Object);

        var service = new BlogService(mockContext.Object);
        var blogs = service.GetAllBlogs();

        Assert.AreEqual(3,blogs.Count);
        Assert.AreEqual("AAA",blogs[0].Name);
        Assert.AreEqual("BBB",blogs[1].Name);
        Assert.AreEqual("ZZZ",blogs[2].Name);
    }
}

asp.net – 使用MVC4的Autofac:控制器没有默认构造函数

asp.net – 使用MVC4的Autofac:控制器没有默认构造函数

我一直在使用MVC3中的Autofac,并喜欢它.现在我试图用MVC4实现它.

我通过软件包管理器控制台(Install-Package Autofac.Mvc4 -Pre和Install-Package Autofac.WebApi -Pre)安装了Autofac MVC4和Autofac WebApi的预发行版本.

我调整了我的IoC容器如下:

private static void SetAutofacContainer()
    {
        var builder = new ContainerBuilder();

        builder.RegisterControllers(Assembly.GetExecutingAssembly());
        builder.RegisterapiControllers(Assembly.GetExecutingAssembly());

        builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerHttpRequest().InstancePerApiRequest();
        builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>().InstancePerHttpRequest().InstancePerApiRequest();
        builder.RegisterType<RepositoryWrapper>().As<RepositoryWrapper>().InstancePerHttpRequest().InstancePerApiRequest();
        builder.RegisterType<ServiceWrapper>().As<ServiceWrapper>().InstancePerHttpRequest().InstancePerApiRequest();

        // Repositories
        builder.RegisterassemblyTypes(typeof(UserRepository).Assembly).Where(t => t.Name.EndsWith("Repository")).AsImplementedInterfaces().InstancePerHttpRequest().InstancePerApiRequest();

        // Services
        builder.RegisterassemblyTypes(typeof(UserService).Assembly).Where(t => t.Name.EndsWith("Service")).AsImplementedInterfaces().InstancePerHttpRequest().InstancePerApiRequest();

        IContainer container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);

    }

当我运行应用程序(通过访问API控制器)我得到例外:
“Controllers.UserController”没有默认构造函数“

控制器如下所示:

namespace Controllers
{
[Authorize]
public class UserController : ApiController
{
    private ServiceWrapper _services;

    public UserController(ServiceWrapper services)
    {
        _services = services;
    }

    // GET api/user/{userrequest}
    public IQueryable<User> Get(UserRequest request)
    {
        if (ModelState.IsValid)
        {
          '...
        }  
    } 
}

我错过了什么吗?我没有设置好吗?任何帮助将不胜感激!

更新

我的API控制器位于同一解决方案的单独项目中.如果我将API控制器放在我的主要MVC项目中,它可以工作.有人可以告诉我如何让Autofac在我的API项目中注册API控制器?

解决方法

使用RegisterapiController方法,您可以告诉Autofac哪个(在哪个程序集中)它应该查找您的ApiControllers

所以下面来电:

builder.RegisterapiControllers(Assembly.GetExecutingAssembly());

从当前程序集(project)注册ApiController.

如果您在另一个项目中也有ApiControllers,则需要使用它:

builder.RegisterapiControllers(typeof(UserController).Assembly);

这意味着:将所有ApiController注册到UserController所在的程序集(project)中.因此,即使您在程序集(项目)中有多个ApiController,每个程序集只需要一个RegisterapiControllers.

今天关于Java:没有默认构造函数的class的newInstancejava没有可用的默认构造函数的介绍到此结束,谢谢您的阅读,有关*** 关于构造函数,默认构造函数,构造函数的默认参数、android – 视图中没有默认构造函数、asp.net – Moq Parent没有默认构造函数.必须显式定义默认构造函数、asp.net – 使用MVC4的Autofac:控制器没有默认构造函数等更多相关知识的信息可以在本站进行查询。

本文标签: