`
gp562
  • 浏览: 10698 次
  • 性别: Icon_minigender_2
  • 来自: 长沙
社区版块
存档分类
最新评论
阅读更多

Class.forName()方法实例化Class对象之后,直接调用newInstance()方法就可以进行对象的实例化操作。但要注意的是,被实例化对象的类中必须存在无参构造方法,如果不存在则肯定是无法实例化的。在实际的Java程序开发中,反射是最为重要的操作原理,在现在的开发设计中大量地应用了反射处理机制,如Struts、Spring框架等;在大部分的操作中基本上都是操作无参构造方法,所以使用反射开发时类中尽量保留无参的构造方法。

 

如果没有无参构造方法,就一定不能进行实例化对象操作吗?答案是否定的,只要在操作时明确地调用类中的构造方法,将参数传递进去同样可以进行实例化操作。操作步骤如下:

1.通过Class类中的getConstructors()取得本类中的全部构造方法;

2.向构造方法中传递一个对象数组进行,里面包含了构造方法中所需的各个参数;

3.之后通过Constructor实例化对象

 

 

import java.lang.reflect.Constructor;

class Person
{
    private String name;
    private int age;
    
    public Person(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
    
    public String getName()
    {
        return this.name;
    }
    
    public void setName(String name)
    {
        this.name=name;
    }
    
    public int getAge()
    {
        return this.age;
    }
    
    public void setAge(int age)
    {
        this.age=age;
    }
    
    public String toString()
    {
        return "姓名:"+this.name+";"+"年龄:"+this.age;
    }
}

public class ClassInstance {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stubC
        Class<?> class1=null;
        try {
            class1=Class.forName("com.yuchao.reflect.Person");
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        Person person=null;
        Constructor<?> constructons[]=null;
        constructons=class1.getConstructors();        
        try {
            //person=(Person)class1.newInstance();
            person=(Person)constructons[0].newInstance("yuchao",25);
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }        
        System.out.println(person);
    }

}

 

程序运行结果:

姓名:yuchao;年龄:25

以上代码虽然已经完成了对象的实例化过程,但是代码比较复杂,因此在实际开发中尽量保留无参的构造函数。

反射的应用-取得类的结构

java.lang.reflect包中有以下几个类:Constructor、Field、Method

通过以下几个类和Class类就可以共同完成类的反射操作。

取得所实现的全部接口

interface China
{
    public static final String NATIONAL_STRING="China";
    public static final String AUTHOR_STRING="yuchao";
    public void sayChina();
    public String sayHello(String name,int age);
}
class Person implements China
{
    private String name;
    private int age;
    
    public Person()
    {
        
    }
    
    public Person(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
    
    public String getName()
    {
        return this.name;
    }
    
    public void setName(String name)
    {
        this.name=name;
    }
    
    public int getAge()
    {
        return this.age;
    }
    
    public void setAge(int age)
    {
        this.age=age;
    }
    
    public String toString()
    {
        return "姓名:"+this.name+";"+"年龄:"+this.age;
    }

    @Override
    public void sayChina() {
        // TODO Auto-generated method stub
        System.out.println("作者:"+AUTHOR_STRING+",国籍:"+NATIONAL_STRING);        
    }

    @Override
    public String sayHello(String name, int age) {
        // TODO Auto-generated method stub
        return name+",你好!我今年"+age+"岁了!";
    }
}

public class ClassInstance {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stubC
        Class<?> class1=null;
        try {
            class1=Class.forName("com.yuchao.reflect.Person");
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        Class<?> class2[]=class1.getInterfaces();
        for(int i=0;i<class2.length;i++)
        {
            System.out.println("实现的接口名称:"+class2[i].getName());
        }
    }

}

 取得父类,只需将class1.getInterfaces()改成class1.getSuperClass()、class.getConstructors()、class1.getConstructors()[0].getModifiers()

分享到:
评论

相关推荐

    Python 含参构造函数实例详解

    5. **实例化对象**:通过`my_old_http = MyOdlHttp('admin', '123')`这行代码,创建了`MyOdlHttp`类的一个实例,并将`'admin'`和`'123'`作为参数传递给构造函数。 6. **输出结果**:根据上述代码,运行后会输出`...

    java实例化对象的过程

    在Java编程语言中,实例化对象是创建类的实例,使其具有...总的来说,Java实例化对象是编程中的基本操作,它涉及到类的构造,内存分配,方法调用等多个核心概念。理解这一过程对于深入学习Java和面向对象编程至关重要。

    在派生类的构造函数中调用基类的构造函数

    通过这样的实例,读者可以深入理解构造函数的调用顺序,以及如何在多级继承和复杂类层次结构中管理对象初始化。 了解并熟练掌握这种调用机制对于编写健壮的C++代码至关重要,因为它能确保类的层次结构在初始化时的...

    通过构造函数实例化对象的方法

    通过构造函数实例化对象的方法 在面向对象编程(OOP)中,构造函数是一种特殊的方法,它用于初始化类的对象。通过构造函数实例化对象是 Java 中的一种常见的实践。在本文中,我们将探讨通过构造函数实例化对象的...

    java 构造器的调用

    - 当我们创建一个类的实例时,会自动调用构造器来设置初始状态。例如: ```java class MyClass { int x; MyClass(int value) { x = value; } } MyClass obj = new MyClass(5); // 这里就调用了构造器 ``` ...

    Java实例化一个抽象类对象的方法教程

    当子类实例化时,会调用抽象类中的构造方法进行初始化。 在Java中,实例化抽象类的一种常见方式是通过子类继承并实现抽象方法。假设有一个抽象类`AbstractBase`: ```java public abstract class AbstractBase { ...

    子类需不需要调用父类有参或者无参问题1

    如果父类只有带参数的构造方法,那么子类的构造方法必须在其首行显式地调用父类的有参构造方法,使用`super(parameters...)`。这是因为在这种情况下,没有默认的无参构造方法供子类调用,如果不显式指定,编译器无法...

    Java继承时构造函数的调用

    首先,每个Java类都有一个或多个构造函数,它们的主要作用是在创建对象时初始化对象的状态。如果一个类没有显式定义任何构造函数,Java编译器会自动生成一个默认的无参数构造函数。默认构造函数没有执行任何特定操作...

    java反射机制学习(二):通过反射获取构造方法并实例化对象

    若要实例化对象,我们可以调用`Constructor`对象的`newInstance()`方法,并传入与构造方法参数类型匹配的参数值。如果`SUser`类有一个无参构造方法,我们可以通过以下方式创建对象: ```java Constructor&lt;?&gt; ...

    java 使用静态成员变量计算内存中实例化的对象数目

    在Java编程语言中,了解如何计算内存中实例化对象的数量是一项重要的技能,这对于优化程序性能、理解和管理资源分配至关重要。本篇文章将详细讲解如何利用静态成员变量来追踪和计算一个类在运行时创建的实例数量。 ...

    dotnet C# 多次对一个对象调用构造函数会发生什么.rar

    在.NET框架中,C#是一种常用的面向对象...在编写代码时,应确保构造函数的设计能够正确地初始化对象,并避免不必要的重复初始化。同时,理解对象生命周期和成员变量状态的变化,可以帮助我们编写更加健壮和高效的代码。

    javascript中使用new与不使用实例化对象的区别

    请问这以下两种实例化对象方式有什么区别呢? var mefun1 = new Me('fei','20','it'); var mefun2 = Me('fei','20','it'); 简单的说 第一种是构造函数式,即通过new运算符调用构造函数Function来创建函数 第二种...

    dotnet C# 只创建对象不调用构造函数方法.rar

    在创建类实例时,通常我们会使用构造函数来初始化对象的状态。然而,在某些特定情况下,我们可能希望只创建对象而不调用构造函数。这样的需求可能出现在诸如序列化、反射或元数据处理等场景中。下面将详细探讨如何在...

    Java子类对象的实例化过程分析

    1. 父类的无参构造函数调用:在子类对象实例化时,会默认先调用父类中的无参构造函数。这是因为Java语言的继承机制,子类继承了父类的所有成员变量和方法,包括构造函数。 2. 子类构造函数的调用:在父类的无参构造...

    java 静态块实例块构造器调用

    当创建对象时,构造器会被调用来初始化对象的属性。 ```java public class Parent { public Parent() { System.out.println("Parent constructor"); } } ``` ### 继承中的调用顺序 在Java继承体系中,子类会...

    面向对象-构造函数-调用&内存图解

    总结来说,"面向对象-构造函数-调用&内存图解"涵盖了构造函数在对象创建过程中的角色,以及构造函数调用如何影响内存分配和对象实例化。理解这些概念对于编写高效、健壮的面向对象代码至关重要,特别是在处理大量...

    java 基础 类对象创建实例化过程 实例解析

    继承关系:类的实例化顺序 * 执行过程为:启动类是否为继承关系树中的一个,如果是则先执行启动类的所有父类的静态语句块;然后执行启动类的静态语句块static{} -&gt; * 执行启动类的main函数 -&gt; 创建对象的继承树从...

    C++类继承之子类调用父类的构造函数的实例详解

    此外,类中还定义了一个构造函数,用于初始化对象,和一个析构函数,用于释放对象所占用的资源。 在构造函数中,我们使用了两个参数:host和port,用于指定HTTP请求的主机名和端口号。 接下来,我们定义了一个名为...

    Java4Android 19_子类实例化过程

    当一个子类实例化时,其实例化过程涉及到多个步骤,这些步骤不仅包括自身的构造器执行,还包括对父类构造器的调用。下面将详细阐述Java中子类实例化的过程及其相关知识点。 首先,子类实例化时会先调用父类的构造器...

Global site tag (gtag.js) - Google Analytics