Java编程--反射(Ⅱ 反射实例化对象)
三.反射实例化对象
反射实例化对象:若有了Class类对象,则可以做到利用反射来实现对象实例化操作。
(1)实例化对象方法:
public T newInstance() throws InstantiationException, 创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未初始化,则初始化这个类。 |
假设有一个Book类:
class Book{
public Book(){
System.out.println("********** Book的无参构造方法 **********");
}
@Override
public String toString() {
return "This is a book";
}
}
【范例】传统实例化模式:
public class Test1 {
public static void main(String[] args) throws Exception {
Book b = new Book();
System.out.println(b.toString());
}
}
有了反射之后对象实例化的操作不再是单独的依靠new来完成了,反射也同样可以完成。
【范例】通过反射实现实例化对象操作。
public class Test1 {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("com.it.test1.Book");
Object obj = cls.newInstance(); // 相当于使用new调用无参构造实例化
Book book = (Book) obj;
System.out.println(book.toString());
}
}
【注意】在任何的开发之中,new是造成耦合的最大元凶,一切的耦合都起源于new。
【范例】参考工厂设计模式。
interface Fruit{
public void eat();
}
class Apple implements Fruit{
@Override
public void eat() {
System.out.println("eat apples...");
}
}
class Orange implements Fruit{
@Override
public void eat() {
System.out.println("eat oranges...");
}
}
class Factory{
public static Fruit getInstance(String className){
if (className.equals("apple")){
return new Apple();
} else if (className.equals("orange")){
return new Orange();
}
return null;
}
}
public class FactoryDemo {
public static void main(String[] args) {
Fruit f = Factory.getInstance("orange");
f.eat();
}
}
此时如果增加Fruit接口子类,则就表示程序要修改工厂类。
因为现在工厂类中的对象都是通过new实例化的。要想解决这个问题,就只能依靠反射完成。
interface Fruit {
public void eat();
}
class Apple implements Fruit {
@Override
public void eat() {
System.out.println("...eat apple");
}
}
class Factory {
public static Fruit getInstance(String className) {
Fruit f = null;
try {
f = (Fruit) Class.forName(className).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return f;
}
}
public class TestFactory {
public static void main(String[] args) {
Fruit f = Factory.getInstance("com.factory.test.Apple");
f.eat();
}
}
现在的程序每次有新添加的水果并不需要修改工厂类,真正完成了解耦合的目的,而且可扩展性强。