不明白明明可以直接new却要这么大费周折的用反射机制来进行创建实例,书上说以后的框架会大量用到反射。算了,先写点再说吧。
看到一个内容量很大的关于反射机制的博客,说不定可以找时间仔细读一下。
http://blog.csdn.net/yongjian1092/article/details/7364451
以下是学习时认为比较重要的东西
1.根据对象找到类
package 对象的引用与传递;
import java.util.Date;
public class TestReflection {
public static void main(String[] args) {
// TODO Auto-generated method stub
Date date =new Date();
Class<?> cls=date.getClass();
System.out.println(cls); //通过Java反射机制得到类的包名
}
}
输出:
class java.util.Date
2.根据对象找到类
package 对象的引用与传递;
class Books {
private String title ;
private double price ;
public void setPrice(double price) {
this.price = price;
}
public void setTitle(String title) {
this.title = title;
}
// getter略
@Override
public String toString() {
return "图书名称:" + this.title + ",价格:" + this.price ;
}
}
public class TestReflection01 {
public static void main(String args[]) throws Exception {
Class<?> cls = Class.forName("对象的引用与传递.Books") ;//必须加包名(包名.类名 即对象的引用与传递.Books )
Books book = (Books) cls.newInstance() ; //通过反射创建的运行时类对象的得到对象(构造方法)
book.setTitle("Java开发实战经典") ;
book.setPrice(79.8) ;
System.out.println(book);
}
}
输出:
图书名称:Java开发实战经典,价格:79.8
3.使用反射机制的工厂模式
package 对象的引用与传递;
interface Bookd
{
public String getTitle();
}
class MathBook implements Bookd
{
@Override
public String getTitle()
{
return "数学书";
}
}
class ComputerBook implements Bookd
{
@Override
public String getTitle()
{
return "计算机书";
}
}
class Factory
{
public static Bookd getinstance(String className)
{
Bookd book=null;
try {
book=(Bookd)Class.forName(className).newInstance();//通过反射得到对应类的对象
} catch (Exception e) {
e.printStackTrace();
}
return book;
}
}
public class TestFactory01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Bookd book=Factory.getinstance("对象的引用与传递.ComputerBook");//传递包名.类名组合而成的字符串来创建一个对象
System.out.println(book.getTitle());
}
}
输出:
计算机书
4.调用构造方法取得实例化对象
package 对象的引用与传递;
import java.lang.reflect.Constructor;
class newBook
{
private String title;
private double price;
public newBook(String title,double price)
{
this.title=title;
this.price=price;
}
@Override
public String toString()
{
return "图书名称:"+this.title+",价格:"+this.price;
}
}
public class TestInstance {
public static void main(String[] args) throws Exception {
//通过反射获取运行时类对象(包名.类名)
Class<?>cls=Class.forName("对象的引用与传递.newBook");
//通过反射获取构造方法。因为是运行时类,所以要类名加.class
Constructor<?>cons=cls.getConstructor(String.class,double.class);
//调用构造方法取得实例化对象
newBook book=(newBook)cons.newInstance("Java开发实战经典" ,79.8);
System.out.println(book);
}
}
输出:
图书名称:Java开发实战经典,价格:79.8