反射:将类的各个部分封装为其他对象。好处:1.可以在程序运行中操作这些对象,2.可以解耦,提高程序可扩展性
1.方法:
Field[] getFields();//获取获取所有public修饰的成员变量
Field[] getDeclaredFields();获取所有成员变量
Constructor getConstructor();//获取空参构造方法
Constructor getConstructor(param,.....);//获取有参构造方法
Constructor getDeclaredConstructor();//获取所有构造方法
Method[] getMethod();//获取成员方法;
构建一个Person类
public class Person {
private String name;
private String gender;
private int age;
public String address;
public int id;
public Person() {
}
public Person(String name, String gender, int age) {
this.name = name;
this.gender = gender;
this.age = age;
}
public void eat(){
System.out.println(this.name+"吃饭了");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", gender='" + gender + '\'' +
", age=" + age +
'}';
}
}
package com.hetl.fanshe;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Demo01 {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
//获取Person的class对象
Class personClass = Person.class;
Field[] fields =personClass.getFields();//获取所有public修饰的成员变量
for(Field field :fields){
System.out.println(field);
System.out.println(field.getName());
}
System.out.println("===========");
Field[] fields1 =personClass.getDeclaredFields();//获取所有成员变量
for(Field field1 :fields1){
System.out.println(field1);
System.out.println(field1.getName());
}
System.out.println("===========");
Constructor constructor = personClass.getConstructor(String.class,String.class,int.class);
Constructor constructor1 = personClass.getConstructor();
System.out.println(constructor);
System.out.println(constructor1);
System.out.println("===========");
Constructor constructor2 = personClass.getDeclaredConstructor();
System.out.println(constructor2);
Method m = personClass.getMethod("eat");
Person p = new Person();
m.invoke(p);
}
}
输出
public java.lang.String com.hetl.fanshe.Person.address
address
public int com.hetl.fanshe.Person.id
id
===========
private java.lang.String com.hetl.fanshe.Person.name
name
private java.lang.String com.hetl.fanshe.Person.gender
gender
private int com.hetl.fanshe.Person.age
age
public java.lang.String com.hetl.fanshe.Person.address
address
public int com.hetl.fanshe.Person.id
id
===========
public com.hetl.fanshe.Person(java.lang.String,java.lang.String,int)
public com.hetl.fanshe.Person()
===========
public com.hetl.fanshe.Person()
null吃饭了
prop.properties
className = com.hetl.fanshe.Person
methodName = eat
public static void main(String[] args) throws Exception {
Properties prop = new Properties();
ClassLoader cl = Demo02.class.getClassLoader();
InputStream is = cl.getResourceAsStream("prop.properties");
prop.load(is);
String className = prop.getProperty("className");
String methodName = prop.getProperty("methodName");
Class c = Class.forName(className);
Object obj = c.newInstance();
Method m = c.getMethod(methodName);
m.invoke(obj);
}