Java反射可以在运行时动态的获取某个类的信息,并且可以调用里面的方法,反射技术在很多框架里经常被应用。
1.通过反射调用构造方法
public static void getInstance(String name) throws Exception {
Class clz = Class.forName(name);
Person p1 = (Person)clz.newInstance();//无参构造函数
System.out.println("Person age == " + p1.getAge() + ", name == " + p1.getName());
Constructor con = clz.getConstructor(int.class, String.class);//带参构造函数 参数类型
Person p2 = (Person) con.newInstance(1, "1");带参构造函数 参数值
System.out.println("Person age == " + p2.getAge() + ", name == " + p2.getName());
}
可以看到打印出Person的值
===================================
Person age == 0, name == null
Person age == 1, name == 1
===================================
2.通过反射调用方法
现在有一个JavaBean Person
public class Person {
private String sex;
private String name;
private String dep;
private String address;
private String id;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDep() {
return dep;
}
public void setDep(String dep) {
this.dep = dep;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
现在要通过反射动态的给每个属性赋值,并且取值。加入两个方法分别给属性赋值并且取值
/**
*
* @Title: setProp
* @Description: TODO(给属性赋值)
* @param @param prop 属性名
* @param @param value 属性值
* @return void 返回类型
* @throws
*/
private static void setProp(String prop, String value) throws Exception {
Method method = clz.getDeclaredMethod("set" + value, String.class);//方法名,参数类型
method.invoke(p, value);//所调用的对象, 参数值
}
/**
*
* @Title: getProp
* @Description: TODO(取属性的值)
* @param @param prop 属性名
* @return Object 所调用方法的返回值
* @throws
*/
private static Object getProp(String prop) throws Exception {
Method method = clz.getDeclaredMethod("get" + prop);//方法名
Object rvalue = method.invoke(p);//所调用的对象
return rvalue;
}
分别调用Person里面的setXXX和getXXX方法
static Class clz;
static Person p;
public static void main(String[] args) throws Exception {
String[] prop = {"Sex", "Name", "Dep", "Address", "Id"};
clz = Person.class;
p = (Person) clz.newInstance();
for (int i = 0; i < prop.length; i++) {
setProp(prop[i], prop[i]);
Object obj = getProp(prop[i]);
System.out.println(prop[i] + " === " + obj);
}
}
打印出
Sex === Sex
Name === Name
Dep === Dep
Address === Address
Id === Id
3.读取配置文件
有的时候我们需要把一些配置写到配置文件里面,比如ip,host。这样当环境改变的时候我们可以不用改变源码直接改配置文件就可以修改配置。
写好一个配置文件
domain=http://172.16.1.185:9001/
把这个文件放到工程的classpath目录下面
现在要读取这个配置文件,可以通过获取ClassLoader获取classpath下的config.properties
Properties props = new Properties();
//读取FileStore.properties配置文件
props.load(PropTest.class.getClassLoader().getResourceAsStream("config.properties"));
String filePath = props.getProperty("domain");