Constructor<?> cons[]=demo.getConstructors();在JDK1.7报错,在JDK1.6可以运行
百度了一下,发现这篇文章,java反射中构造函数的问题
http://bbs.csdn.net/topics/390183924
package Reflect; import java.lang.reflect.Constructor; class Person{ public Person() { } public Person(String name){ this.name=name; } public Person(int age){ this.age=age; } public Person(String name, int age) { this.age=age; this.name=name; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString(){ return "["+this.name+" "+this.age+"]"; } private String name; private int age; } class Hello{ public static void main(String[] args) { Class<?> demo=null; try{ demo=Class.forName("Reflect.Person"); }catch (Exception e) { e.printStackTrace(); } Person per1=null; Person per2=null; Person per3=null; Person per4=null; //取得全部的构造函数 Constructor<?> cons[]=demo.getConstructors(); try{ per1=(Person)cons[0].newInstance(); per2=(Person)cons[1].newInstance("Rollen"); per3=(Person)cons[2].newInstance(20); per4=(Person)cons[3].newInstance("Rollen",20); }catch(Exception e){ e.printStackTrace(); } System.out.println(per1); System.out.println(per2); System.out.println(per3); System.out.println(per4); } }
这段程序在JDK1.7运行出错,
null
null
null
null
java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at Reflect.hello.main(hello.java:49)
JDK1.6可以运行.
上述帖子给出方法
可以修改为
class Hello{ public static void main(String[] args) { Class<?> demo = null; try { demo = Class.forName("Reflect.Person"); Constructor cons0 = demo.getConstructor(); Constructor cons1 = demo.getConstructor(String.class); Constructor cons2 = demo.getConstructor(int.class); Constructor cons3 = demo.getConstructor(String.class,int.class); Person per1 = (Person) cons0.newInstance(); Person per2 = (Person) cons1.newInstance("Rollen"); Person per3 = (Person) cons2.newInstance(20); Person per4 = (Person) cons3.newInstance("Rollen", 20); System.out.println(per1); System.out.println(per2); System.out.println(per3); System.out.println(per4); } catch (Exception e) { e.printStackTrace(); } } }
问题解决.
相关推荐
Object obj = constructor.newInstance("Hello"); ``` #### 15.4 使用反射调用方法和操作成员变量 反射不仅可以用于创建对象,还可以用于调用方法和修改成员变量: 1. **调用方法**: - 使用`getMethod`或`...
>[] parameterTypes = constructor.getParameterTypes(); System.out.print("构造方法是:"); for (Class<?> parameterType : parameterTypes) { System.out.print(parameterType.getSimpleName() + " "); } } `...
>[] paramTypes = constructor.getParameterTypes(); System.out.println("Constructor: " + Modifier.toString(constructor.getModifiers()) + " " + clazz.getName() + "(" + Arrays.toString(paramTypes) + ")")...
Object instance = constructor.newInstance("张三", 25); ``` 这里,`getConstructor(Class<?>... parameterTypes)`方法接收一个类型数组,对应于构造方法的参数类型。 反射机制在很多场景下都很有用,如插件框架...
Java反射是Java编程语言的核心特性之一,它允许程序员在运行时检查和操作类、接口、字段和方法等对象。这使得Java程序具有高度的灵活性和动态性,可以在不事先知晓具体类信息的情况下处理对象。 首先,要使用Java...
> cons = clazz.getConstructor(paramTypes);` - `Object obj = cons.newInstance(args);` 3. 访问和修改字段:`Field`类用于访问类的字段。可以使用`get()`和`set()`方法读取和设置字段值,包括私有字段: - `...
> constructor = c.getConstructor(Class<?>... parameterTypes);` - 获取所有声明的构造器(包括私有的):`Constructor<?>[] declaredConstructors = c.getDeclaredConstructors();` - 获取指定的声明构造器:`...
在Java编程语言中,反射API(Reflection API)是一种强大的工具,允许程序在运行时检查和操作其他类的信息,包括类的结构、字段、方法以及构造器。反射API使得程序员可以在未知类名或方法名的情况下,动态地创建对象...
Object instance1 = constructor.newInstance(); Object instance2 = constructor.newInstance(); ``` 在`ParamClass.java`中,可能会定义一个类,其中包含一些参数化的构造器或方法。通过反射,我们可以动态传递...
> getConstructor(Class<?>... parameterTypes)`:获取带有指定参数类型的公共构造函数。 - `Constructor<?> getDeclaredConstructor(Class<?>... parameterTypes)`:获取带有指定参数类型的构造函数,包括私有构造...
Object obj = constructor.newInstance(args); ``` #### 2.3 获取方法并调用 ```java String methodName = "study"; Class<?>[] paramTypes = {String.class}; Method method = clazz.getMethod(methodName, ...
`,然后`Object obj = constructor.newInstance(参数...);`。 6. **枚举常量**:通过`getEnumConstants()`方法获取枚举类型的常量数组。 7. **接口和实现类**:通过`getInterfaces()`获取接口列表,`...
- `getConstructor(Class<?>... parameterTypes)`:获取公共构造器。 - `getDeclaredConstructor(Class<?>... parameterTypes)`:获取所有构造器。 - `newInstance(Object... initArgs)`:通过构造器创建对象。 ...
- 使用构造器创建对象:`Object obj = constructor.newInstance(args);` 3. **调用方法** - 获取方法:`Method method = clazz.getMethod(methodName, paramTypes);` - 调用方法:`method.invoke(obj, args);` ...
Java 反射(Java Reflection)是Java编程语言中的一种高级特性,它允许程序在运行时动态地获取类的信息(如类名、字段、方法等)并进行操作,从而增加了程序的灵活性和动态性。以下是对Java反射机制的详细解释: 1. ...
Object instance = constructor.newInstance(); ``` ### 4. 访问字段 使用`getFields()`或`getField()`方法获取类的公共字段,`getDeclaredFields()`获取所有字段(包括私有和受保护的)。然后,可以使用`set()`和...
Class<Demo> demoClass = Demo.class; ``` 2. **使用`Class.forName(String className)`**: ```java Class<?> demoClass = Class.forName("Reflect.Demo"); ``` 3. **使用对象的`getClass()`方法**: ```java ...
> cons = newoneClass.getConstructor(argsClass); return cons.newInstance(args); } ``` 这段代码展示了如何使用反射创建一个新的对象实例。通过 `Class.forName()` 获取类信息,然后根据构造函数的参数类型获取...
`获取构造器,然后`constructor.newInstance(参数...);`来创建新的对象。 6. 探索类信息:反射还允许我们获取类的元数据,如类名、父类、接口、注解等。 这个“Java反射事例”可能会包含以下代码片段: - 一个...