反射的定义
动态获取字节码文件,将成员进行抽象化处理.
Field---对属性的抽象形成的类
Method----对方法的抽象形成的类
Constructor----对构造方法抽象形成的类
反射可以不通过new建立新对象,在不改变测试代码的情况下建立一个新对象
实例案例:
/* 分析: 要求:首先实现最基本的功能 功能描述:人使用电脑,用鼠标,用键盘 需要创建NoteBook(电脑类),鼠标类,键盘类,接口USB,鼠标类,键盘类都实现USB接口 创建测试类test 实现基本功能 进阶功能:在不改变test代码的前提下,给电脑新增UPan的功能 分析:再通过一个配置文件进行简单的配置即可. */
测试类:
public class teat {
public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException {
//测试
/*
Mouse mouse=new Mouse();
Keyboard keyboard=new Keyboard();
NoteBook noteBook=new NoteBook("华为");
noteBook.useMouse(mouse);
noteBook.useMouse(keyboard);
noteBook.work();
*/
//进阶功能:在不改变test代码的前提下,给电脑新增UPan的功能
//读取配置文件的信息
Properties properties=new Properties();
properties.load(new FileReader("src\\Morning\\config.properties"));
for (int i = 0; i < properties.size(); i++) {
String key="usb"+i;
String value= properties.getProperty(key);
//利用反射
Class cla= Class.forName(value);
//创建实例对象
USB usb=(USB) cla.newInstance();
usb.open();
usb.close();
}
}
}
//建立Keyboard类
public class Keyboard implements USB{
//打开
public void open(){
System.out.println("打开键盘");
}
//关闭
public void close(){
System.out.println("关闭键盘");
}
}
//建立Mouse类
public class Mouse implements USB{
//打开
public void open(){
System.out.println("打开鼠标");
}
//关闭
public void close(){
System.out.println("关闭鼠标");
}
}
//创建NoteBook类
public class NoteBook {
String name;
public NoteBook(String name) {
this.name = name;
}
//工作
public void work(){
System.out.println("打自己写的游戏");
}
//用鼠标
//用键盘
public void useMouse(USB usb){
usb.open();
usb.close();
}
}
//创建UPan类
public class UPan implements USB{
@Override
public void open() {
System.out.println("打开U盘");
}
@Override
public void close() {
System.out.println("关闭U盘");
}
}
//创建YinXiang类
public class YinXiang implements USB{
@Override
public void open() {
System.out.println("打开音响");
}
@Override
public void close() {
System.out.println("关闭音响");
}
}
//创建接口
public interface USB {
void open();
void close();
}
//创建config.properties文件(Morning是当前工程下的一个包名)
usb0=Morning.Mouse
usb1=Morning.Keyboard
//在不改变test代码的前提下,给电脑新增UPan的功能
usb2=Morning.UPan
usb3=Morning.YinXiang