java反射机制基础

时间:2023-02-16 16:13:11
//LearnReflect.java
package cn.itcast.reflect;


import java.io.File;
import java.io.FileInputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;

public class LearnReflect {

/**
* @param args
* @throws Exception
* @throws InstantiationException
*/
public static void main(String[] args) throws InstantiationException, Exception {
MainCard man=new MainCard();
/*
* 原来旧的方法
*/
man.harddisk();
man.memory();

/*
* 扩展后加入的类和方法
*/
//读取配置文件
File file=new File("pci.properties");
FileInputStream fis=new FileInputStream(file);
Properties properties=new Properties();
/*
* 加载流
*/
properties.load(fis);
String pciname=null;
/*
* 循环读取配置文件的信息
*/
for(int i=1;i<=properties.size();i++)
{
pciname=properties.getProperty("pci"+i);
OutRun(man, pciname);
}
fis.close();


}

/*
* 扩展类方法的使用
*/
private static void OutRun(MainCard man, String pciname) throws Exception {
Class clazz=Class.forName(pciname);
PCI pci=(PCI)clazz.newInstance();
/*
* 使用实现了PCI借口的类的方法
*/
man.runPCI(pci);
/*
* 有参函数的的调用
*/
Method method=clazz.getMethod("hello", String.class);
/*
* 创建一个默认的构造函数对象
*/
Object obj=clazz.newInstance();
/*
* 函数的调用和参数的注入
*/
method.invoke(obj, "Hello World!");

//设置字段的值
Field field=clazz.getDeclaredField("name");
field.set(obj, "张三");

/*还有很多
* 1、获取字段
*指定字段(无论是public,protect或private)的获取和赋值
*get.getDeclaredField("name")
*get.getDeclaredFields();
*还有get.getFiled("name");获取指定public的字段
*还有get.getFileds();获取所有public的字段
*2、获取方法
*指定方法(无论是public,protect或private)的获取和赋值
*get.getDeclaredMethod("name");
*获取所有的方法(无论是public,protect或private)
*get.getDeclaredMethods();
*还有get.getMethod("name");获取指定public的字段
*还有get.getMethods();获取所有public的字段
*3、获取构造函数
*
*getDeclaredConstructor(Class<?>... parameterTypes)
*/
}
}

//MainCard.java

package cn.itcast.reflect;


public class MainCard {


public void harddisk()
{
System.out.println("harddisk running ....");
}
public void memory()
{
System.out.println("memery running.....");
}

public void runPCI(PCI pci)
{
pci.sound();
pci.look();
}

}

//SoundCard.java

package cn.itcast.reflect;


public class SoundCard implements PCI{


private String name;
public String heheString;
@Override
public void look() {
System.out.println("look running....");

}


@Override
public void sound() {
System.out.println("sound running....");

}

public void hello(String string){
System.out.println("Say" +string+ "to you !");
}



}


//pci.properties配置文件
pci1=cn.itcast.reflect.SoundCard