黑马程序员技术交流社区
标题:
java反射机制-构造方法参数的问题
[打印本页]
作者:
黄敏
时间:
2012-8-22 17:22
标题:
java反射机制-构造方法参数的问题
问题看下面红色标注部分,望老鸟给予详细解答,搞不清楚问题,后面很难学懂得
import java.io.FileReader;
import java.lang.reflect.Constructor;
public class ReflectDemo2 {
/**
* @param args
* @throws Exception
* @throws InstantiationException
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, Exception {
createNewObject_2();
}
public static void createNewObject_2() throws Exception {
// cn.itcast.bean.Person p = new cn.itcast.bean.Person("小强",39);
/*
* 当获取指定名称对应类中的所体现的对象时,
* 而该对象初始化不使用空参数构造该怎么办呢?
* 既然是通过指定的构造 函数进行对象的初始化,
* 所以应该先获取到该构造函数。 通过字节码文件对象即可完成。
* 该方法是:getConstructor(paramterTypes);
*
*/
String name = "cn.itcast.bean.Person";
//找寻该名称类文件,并加载进内存,并产生Class对象。
Class clazz = Class.forName(name);
//获取到了指定的构造函数对 象。
Constructor constructor = clazz.getConstructor(String.class,int.class);
//getConstructor(String.class,int.class)中的参数是怎么确定?为什么就是
String.class和int.class,参数类型为什么又写成
(String.class,int.class)
这种形式的呢?知道是通过
getConstructor方法获得Person类中的构造方法的,Person类中的构造方法是 Person(String name, int age),假如现在不知道Person类中的有参构造方法中的参数有几个呢?,Class是怎么知道这个Person类中有参构造函数的参数个数的?
//通过该构造器对象的newInstance方法进行对象的初始化。
Object obj = constructor.newInstance("小明",38);
}
}
作者:
黄敏
时间:
2012-8-22 17:27
帮顶!!!回一下下啊
作者:
李知伦
时间:
2012-8-22 17:50
为什么就是String.class和int.class
这是由Class类的getConstructor的参数决定的:要求是Class对象的一个数组,即有构造器多少个参数,就传递多少个Type.class进方法
public Constructor<T> getConstructor(Class<?>... parameterTypes)
throws NoSuchMethodException,
SecurityException
Class是怎么知道这个Person类中有几个构造方法?有参构造函数的参数个数的?
就跟你知道类名,public方法名一样,如果构造器是public的,就能通过doc命令,或者API查询到这些资料吧,不然反射也就没法做了
没有已知条件,怎么解题呢
作者:
杜鹏云
时间:
2012-8-22 18:18
反射的本质就是将类中所有的类成分映射成对应的Class对象,这里的Class对象其实可以看成一种类型。
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。
基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。(形如int.class)
参数类型为什么又写成(String.class,int.class)这种形式的呢??这个sun公司就是这么定义的,你 知道他表示什么就行了,这是规则。
getConstructor(Class<?>... parameterTypes)
返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
Class<?>... parameterTypes指定构造函数的类型,当然如果你传递的是一个空参,那么会调用默认构造函数。
如现在不知道Person类中的有参构造方法中的参数有几个呢?,Class是怎么知道这个Person类中有参构造函数的参数个数的?
第一:你可以这么处理:
Constructor<?> [] getConstructors()
返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法 。Constructor<?>就表示你对应的构函不知道形参类型未知。
第二 :遍历Constructor,利用其提供的方法获取对应构函的信息
Type[] getGenericParameterTypes()
按照声明顺序返回一组 Type 对象,这些对象表示此 Constructor 对象所表示的方法的形参 类型。Type[]数组自然会返回你的某个构函的参数个数
Class<?>[] getParameterTypes()
按照声明顺序返回一组 Class 对象,这些对象表示此 Constructor 对象所表示构造方法的形参类型。
Constructor<?>[] constructors = clazz.getConstructor();
for(Constructor<?>cons:constructors )
{
Type[] types=cons.getGenericParameterTypes()
System.out.println(cons.toString()+types.length);
}
作者:
杨鹏鹏
时间:
2012-8-22 18:29
Person类中的构造方法是 Person(
String
name,
int
age), Constructor constructor = clazz.getConstructor(
String
.class
,int
.class); 根据构造器里参数的类型,反射就用 参数对应的类型.class.同时class只有一份,所以能识别。假如现在不知道Person类中的有参构造方法中的参数有几个呢?,Class是怎么知道这个Person类中有参构造函数的参数个数的? 这个我也不清楚,我认为可能是调用默认的无参构造吧
作者:
刘圣伟
时间:
2012-8-22 19:06
public Constructor<?>[] getConstructors()
throws SecurityException返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。如果该类没有公共构造方法,或者该类是一个数组类,或者该类反映一个基本类型或 void,则返回一个长度为 0 的数组。 注意,此方法返回 Constructor<T> 对象的数组(即取自此类构造方法的数组)时,此方法的返回类型是 Constructor<?>[],不是 预期的 Constructor<T>[]。此少量信息的返回类型是必需的,因为从此方法返回之后,该数组可能被修改以保存不同类的 Constructor 对象,而这将违反 Constructor<T>[] 的类型保证。
这个方法,可以获取到,所有的,公共的构造方法,打印出来,看看就知道有哪些了,
至于那个地方为什么是,.class, 是因为反射机制的运行原理来决定的,反射就是通过解析这些Class文件,知道,里面有哪些类,哪些方法。
而不需要,软件扩展者来该程序的源码。
和JAVA一样,javac编译运行,需要java文件,java 运行程序需要加载class,
反射也一直直接解析,class,来获取里面的信息,
作者:
刘圣伟
时间:
2012-8-22 19:06
多看看API,会有帮助
作者:
黄敏
时间:
2012-8-23 08:48
问题已解决,谢谢各位
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2