java学习笔记09--反射机制 (二)

2014-11-24 10:46:26 · 作者: · 浏览: 4
ge = age;
}
public String toString() {
// TODO Auto-generated method stub
return "name: " + name + ",age: " + age;
}
}

public class T {

public static void main(String[] args) throws ClassNotFoundException {
Class< > c = Class.forName("com.itmyhome.Person");
Person person = null;
try {
person = (Person) c.newInstance(); //实例化对象
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
person.setName("itmyhome");
person.setAge(23);
System.out.println(person);
}

}

通过以上的代码,可以发现,即使不使用关键字new对象也可以进行实例化操作,反射的作用。

但是,在使用以上操作的时候有一点必须注意,在操作中类中必须存在无参构造方法,否则无法实例化

报以下异常

[java]
java.lang.InstantiationException: com.itmyhome.Person
at java.lang.Class.newInstance0(Class.java:340)
at java.lang.Class.newInstance(Class.java:308)
at com.itmyhome.T.main(T.java:35)
Exception in thread "main" java.lang.NullPointerException
at com.itmyhome.T.main(T.java:41)

java.lang.InstantiationException: com.itmyhome.Person
at java.lang.Class.newInstance0(Class.java:340)
at java.lang.Class.newInstance(Class.java:308)
at com.itmyhome.T.main(T.java:35)
Exception in thread "main" java.lang.NullPointerException
at com.itmyhome.T.main(T.java:41)

对于以上的程序也并非没有解决的方法,也是可以通过其他的方式进行实例化操作的,只是在操作的时候需要明确的调用类中的构造方法,并将参数传递进去之后才可以进行实例化操作,操作步骤如下:

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

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

3、之后通过Constructor实例化对象。

[java]
package com.itmyhome;

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 name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
// TODO Auto-generated method stub
return "name: " + name + ",age: " + age;
}
}

public class T {

public static void main(String[] args) throws ClassNotFoundException{
Class< > c = Class.forName("com.itmyhome.Person");
Constructor< > cons[] = c.getConstructors();
Person person = null;
try {
person = (Person) cons[0].newInstance("itmyhome",23); //实例化对象
} catch (Exception e) {
e.printStackTrace();
}
person.setName("itmyhome");
person.setAge(23);
System.out.println(person);
}

}

package com.itmyhome;

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 name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
// TODO Auto-generated method stub
return "name: " + name + ",age: " + age;
}
}

public class T {

public static void main(String[] args) throws ClassNotFoundException{
Class< > c = Class.forName("com.itmyhome.Person");
Constructor< > cons[] = c.getConstructors();
Person person = null;
try {
person = (Person) cons[0].newInstance("itmyhome