java中反射:Class类的使用(二)

[size=large]通过无参构造实例化对象:[/size]
如果想要通过Class类本身实例化其他类的对象,则可以使用newInstance()方法,但是必须要保证被实例化的类中存在一个无参构造方法。
范例:
Person类:
package com.testFS.test;

public class Person {
private String name;
private int 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;
}
@Override
public String toString() {
return "Person [姓名=" + name + ", 年龄=" + age + "]";
}
}
运行结果:
Person [姓名=hello, 年龄=20]
从程序的运行结果可以发现,通过Class.forName()方法实例化Class对象后,直接调用newInstance()方法就可以根据传入的完整“包.类” 名称的方式进行对象的实例化操作,完全取代之前使用关键字new的操作方式。

切记:被实例化对象的类中必须存在无参构造方法,如果不存在则肯定是无法实例化的。
提示:
在实际的java程序开发中,反射是最重要的操作原理,在现在的开发设计中大量地应用了反射处理机制,如Struts,spring 框架等;在大部分的操作中基本上都操作无参构造方法,所以在开发类中一定要保留无参构造方法。

[size=large]调用有参构造实例化对象:[/size]
对于类中的有参构造方法,在操作时需要明确地调用类中的构造方法,并非将参数传递进去后才可以进行实例化操作。
操作步骤如下:
(1)通过Class类中的getConstructors() 方法取得本类中的全部构造方法。
(2)向构造方法中传递一个对象数组进去,里面包含了构造方法中所需要的各个参数。
(3)之后通过Constructor实例化对象。
这里使用Constructor,表示构造方法:


范例:
Person类:
package com.testFS.test;

public class Person {
private String name;
private int age;

/*public Person() {
super();
// TODO Auto-generated constructor stub
}*/

public Person(String name, int age) {
super();
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;
}
@Override
public String toString() {
return "Person [姓名=" + name + ", 年龄=" + age + "]";
}
}

InstanceDemo02类:
package com.testFS.test;

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

public class InstanceDemo02 {
public static void main(String[] args) {
Class> c=null;
try {
c=Class.forName("com.testFS.test.Person");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Person per=null; //声明Person对象
Constructor> cons[]=null; //声明一个表示构造方法的数组
cons=c.getConstructors(); //通过反射取得全部构造
try {
per=(Person) cons[0].newInstance("Lihua",30);
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(per); //输出对象
}
}
运行结果:
Person [姓名=Lihua, 年龄=30]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值