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()