`
liuchaoyong
  • 浏览: 21603 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java反射Reflection--运行时生成instance

    博客分类:
  • java
阅读更多

文章来自: 博客浙江(blog.zj.com)
原文参考:http://jeplove.blog.zj.com/blog/d-229344.html

想生成对象的实体,在反射动态机制中有两种方法,一个针对无变量的构造方法,一个针对带参数的构造方法,,如果想调用无参数的构造函数直接调用Class类中的newInstance(),而如果想调用有参数的构造函数,则需要调用Constructor类中newInstance()方法,首先准备一个Class[]作为Constructor的参数类型。然后调用该Class对象的getConstructor()方法获得一个专属的Constructor的对象,最后再准备一个Object[]作为Constructor对象昂的newInstance()方法的实参。 在这里需要说明的是 只有两个类拥有newInstance()方法,分别是Class类和Constructor类,Class类中的newInstance()方法是不带参数的,而Constructro类中的newInstance()方法是带参数的需要提供必要的参数。

下面提供的代码是构造Customer2类的三个构造函数
java 代码
package cn.com.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
* 在反射Reflection机制中,想生成一个类的实例有两种方法
* 一个是针对无参数的构造函数 ,另一个是针对有参数的构造函数
*
*/
public class ReflecTest3 {

/**
* 反射的动态性质之一: 运行期动态生成Instance
* @throws IllegalAccessException
* @throws InstantiationException
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws SecurityException
* @throws IllegalArgumentException
*/
public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, SecurityException, InvocationTargetException, NoSuchMethodException {

Customer2 customer=new Customer2();

Class cls=customer.getClass();

//获得Class所代表的对象的所有类型的构造函数Constructor的数组
Constructor ctor[]=cls.getDeclaredConstructors();

for(int i=0;i
//获得对应的构造函数参数列表的Class类型的数组
Class cx[]=ctor.getParameterTypes();

if(cx.length==0){
//无参的构造函数可以通过Class实例直接调用Class类的newInstance()方法
Object obj=cls.newInstance();
//同样也可以象以下这样构造,调用Constructor类的newInstance()方法
//Customer2 obj=(Customer2)cls.getConstructor(cx).newInstance(new Object[]{});
System.out.println(obj);
}else if(cx.length==2){
//此时只能调用Constructor类的newInstance()方法,注意:利用反射调用的是私有private的构造方法
Customer2 obj=(Customer2)cls.getConstructor(cx).newInstance(
new Object[]{new Long(123),"hejianjie"});
System.out.println(obj);
}else if(cx.length==3){
//此时只能调用Constructor类的newInstance()方法,注意:利用反射调用的是公有public的构造方法 Customer2 obj=(Customer2)cls.getConstructor(cx).newInstance(
new Object[]{new Long(133),"China-Boy",new Integer(21)});
System.out.println(obj);
}
}


}

}

class Customer2{

private Long id;

private String name;

private int age;

/**
* 无参数的构造函数
*
*/
public Customer2(){

}

/**
* public修饰的有参数的构造函数,3个参数
* @param id
* @param name
* @param age
*/
public Customer2(Long id,String name,int age){
this.id=id;
this.name=name;
this.age=age;
}

/**
* public修饰的构造函数,2个参数
* @param id
* @param name
*/
public Customer2(Long id,String name){
this.id=id;
this.name=name;
this.age=age;
}

public int getAge() {
return age;
}


public void setAge(int age) {
this.age = age;
}


public Long getId() {
return id;
}


public void setId(Long id) {
this.id = id;
}


public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}

public String toString(){
return ("id=="+this.getId()+" Name=="+this.getName()+" Age:"+this.getAge());
}

}

程序执行结果如下:

java 代码
id==123 Name==hejianjie Age:0
id==133 Name==China-Boy Age:21
id==null Name==null Age:0

显然,第一行是执行的两个参数的构造函数,int类型的age初始化为0,第二行执行的是带三个参数的构造函数,最后,第三行执行的是无参数的构造函数。,Long,String类型的id,name都初始化为null,而int类型的age初始化为0。

分享到:
评论

相关推荐

    Java 反射-动态代理

    Java反射允许我们在运行时检查类、接口、字段和方法的信息,甚至可以创建和调用对象。它主要通过java.lang.Class类和java.lang.reflect包中的类(如Constructor、Method和Field)来实现。以下是一些核心知识点: 1....

    Java-Interview-Question.pdf

    - **反射(Reflection)**: 允许在运行时检查或修改程序的属性。 - **final关键字**: 用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖和类不可继承。 - **垃圾回收(GC)**: Java虚拟机的垃圾回收器负责回收...

    Manning - Java Reflection in Action

    Java反射技术是Java语言的一个重要特性,它允许程序在运行时动态地获取类的信息,并直接操作这些信息。这种能力为开发人员提供了极大的灵活性,同时也带来了一定的学习曲线和技术挑战。《Java Reflection in Action...

    反射案例-仅供查考

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段以及方法的信息。反射机制是Java提供的一种动态类型能力,它使得我们能够在运行时分析类和对象,甚至能够调用...

    java反射机制.pdf

    Java反射机制允许程序在运行时通过`Reflection APIs`获取类的内部信息,包括修饰符(如`public`、`static`等)、父类(如`Object`)、接口(如`Cloneable`)以及字段和方法的信息,并能够在运行时改变字段的值或调用...

    Java反射机制

    Java反射机制是一项强大的技术,它允许开发者在运行时动态地处理类和对象。然而,反射操作可能会带来性能上的开销,并且如果使用不当还可能导致安全问题。因此,在使用反射时应该谨慎考虑其适用性和潜在的风险。

    Java反射实例源码

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是`java.lang.Class`,`java.lang.reflect.Method`,`java.lang....

    JAVA反射与代理

    总的来说,Java反射和代理机制提供了对程序运行时行为的强大控制,使得代码更加灵活和可扩展。但同时,也需要注意反射可能会破坏封装性,增加程序的复杂度,降低性能,因此在实际开发中需谨慎使用。理解并熟练运用...

    候捷谈Java反射机制

    Java反射机制是一种强大的运行时功能,使得Java能够在程序执行过程中动态地获取类的信息并操纵类的对象。这一特性极大地扩展了Java语言的能力,使其更加灵活多变。下面将详细介绍Java反射机制的主要功能及其应用场景...

    Android-注解与反射注解知识点反射知识点注解java反射

    在Java中,注解分为保留期注解(如@Override、@Deprecated)、编译器注解(用于编译时检查)和运行时注解(可以在运行时通过反射获取)。 2. **自定义注解**:开发者可以通过`@interface`关键字自定义注解,定义...

    java reflection

    ### Java反射机制详解 #### 一、Java反射机制概述 在深入探讨Java反射机制之前,我们首先...在后续的文章中,我们将更深入地探索Java反射机制的各个方面,包括运行时元数据访问以及在运行时修改和构建新类的方法。

    Java语言的反射机制.pdf

    Java反射机制允许程序在运行时通过调用Reflection APIs取得任何一个已知名称的Class的内部信息,既包括其修饰符、基类、所实现的接口等,也包括fields和methods的所有信息,并可于运行时改变fields内容或调用methods...

    JAVA反射机制原理及代码

    Java反射机制是Java语言的一个重要特性,它允许程序在运行时获取关于任何已知类的内部信息,包括类的修饰符、超类、实现的接口,以及字段和方法的所有细节。通过反射,我们可以动态地创建对象、访问私有成员、调用...

    Java软件开发实战 Java基础与案例开发详解 15-1 反射 共13页.pdf

    ### Java反射机制详解 ...综上所述,Java反射机制为开发者提供了强大的工具,使得程序能在运行时灵活地操作类和对象。但需要注意的是,反射操作通常会降低程序的性能,并且可能会破坏封装性和安全性,因此应谨慎使用。

    Java动态代理和Java反射的Demo演示

    接下来,我们讨论Java反射。反射是Java的一项强大的功能,它允许我们在运行时检查类、接口、字段和方法的信息,甚至可以在运行时创建和操作类的对象。`java.lang.Class`类是反射的核心,我们可以使用`Class.forName...

Global site tag (gtag.js) - Google Analytics