Java的反射机制

不明白明明可以直接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





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水之积也不厚,则其负大舟也无力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值