package Reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;
public class test {
/*
* 全类名:包名.类名
* Class类的三种获取方法
1、通过类静态class属性获得Class对象,或者使用实例化对象的getClass()方法
2、 使用Class.forName(全类名String)获得类Class静态属性
3、使用this.getClass().getClassLoader()获取类加载器(ClassLoader类),
使用ClassLoader类loadClass(全类名String)方法获取Class对象
* Class:可以获得实例化对象,或者获得属性类Field,方法类Method
* newInstance():获取实例化对象,该类需要有无参构造方法
* getField(String name):根据属性名获取公共属性(public)对象Field
* getFields():获取所有公共属性(public)对象Field数组
* getDeclaredField(String name):根据属性名可获取所有属性(private、protected、public)对象Field
* getDeclaredFields():获取所有属性(private、protected、public)对象Field数组
* getMethod(String name,Class[] parameterTypes):根据方法名,方法传入参数Class数组获取公共
* 方法对象(public)Method
* getMethods():获取所有公共方法(public)对象Method数组
* getDeclaredMethod(String name,Class[] parameterTypes):根据方法名,方法传入参数Class数组可获取所有
* 方法(private、protected、public)对象Method
* getDeclaredMethods():获取所有方法(private、protected、public)对象Method数组
*
*
* Field:属性类
* set(Object,T value):设置Object实例化对象的属性值为T
* setAccessible(true):设置私有属性可被外部反射修改
* get():返回当前属性值
*
*
* Method:方法类
* setAccessible(true):设置私有方法可被外部反射调用
* invoke(String methodName,Object[] parameterValue):调用当前方法,methodName为方法名,
* parameterValue为传入参数,返回值为方法返回值
*/
public static void main(String[] args) throws Exception {
//Class类的三种获取方法
//通过类静态class属性获得Class对象,或者使用实例化对象的getClass()方法,或者
//使用Class.forName(全类名String)获得类Class静态属性,或者
//使用this.getClass().getClassLoader()获取类加载器(ClassLoader类),使用ClassLoader类loadClass(全类名String)方法获取
Class clazz=Person.class;
System.out.println(clazz.getName());
//通过Class对象newInstance()方法获得实例化对象
Person person=(Person) clazz.newInstance();
//获得变量(公共变量用getField方法,私有变量、保护变量用getDeclaredField方法,同时)
Field field=clazz.getField("name");
field.set(person, "小明");//使用Field对象的set(Object,XXX)方法:Object为具体实例化对象,XXX为修改值
Field field2=clazz.getDeclaredField("age"); //获取私有变量、保护变量方法,也可以获取公共变量
Field field3=clazz.getDeclaredField("name");//
field2.setAccessible(true); //使得私有变量可被修改
field2.set(person, 12);
field3.set(person, "小红");
//获得方法
Method display=clazz.getMethod("display");
//使用Method对象的invoke调用方法
display.invoke(person);
//person.setAge(13);
System.out.println(person.toString());
//读取配置文件,获得Properties对象,利用方法getProperty(String key)获取value值
ReflectTool reflectTool=new ReflectTool();
Properties properties=reflectTool.getProperties("Reflect/my.properties");
System.out.println(properties.getProperty("username"));
test2();
}
private static void test2() throws Exception {
Class clazz=Class.forName("Reflect.Person");
Field[] field=clazz.getDeclaredFields();
for (int i = 0; i < field.length; i++) {
System.out.println(field[i].toString());
}
}
}
class Person{
public String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void display() {
System.out.println("这是一个人");
}
public int display(int age,String name) {
System.out.println("这是一个人");
return 1;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}