Person类
package domain;
public class Person {
public String name;
private int age;
public String a;
public int b;
private int c;
public void eat(){
System.out.println("吃东西");
}
public void eat(String food){
System.out.println("吃" + food);
}
public void play(){
System.out.println("玩");
}
private void sleep(){
System.out.println("睡觉");
}
public Person() {
// TODO Auto-generated constructor stub
}
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;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", a=" + a + ", b=" + b + ", c=" + c + "]";
}
}
1.获取成员变止们
* Field[] getFields();获取所有public修饰的变量
* Field getField(String name )
* Field[] getDeclaredFields();获取所有的成员变量,不考虑修饰符
* Field getDeclaredField(String name)
package reflect;
import java.lang.reflect.Field;
import domain.Person;
/*
* Class对象功能:
*获取功能:(其中有Declared的为不考虑修饰符的方法)
1.获取成员变止们
* Field[] getFields();获取所有public修饰的变量
* Field getField(String name )
* Field[] getDeclaredFields();获取所有的成员变量,不考虑修饰符
* Field getDeclaredField(String name)
2.获取构造方法们
* Constructor<?>[] getConstructors()
* Constructor<T> getConstructor(类<?>... parameterTypes)
Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
* Constructor<?>[] getDeclaredConstructors()
3.获取成员方法们:
* Method[] getMethods()
* Method getMethod(String name,类<?>... parameterTypes)
* Method[] getDeclaredMethods()
* Method getDeclaredMethod(String name,类<?>... parameterTypes)
4:获取类名
*String getName()
*/
public class ReflectDemo02 {
public static void main(String[] args) throws Exception{
Class personClass = Person.class;
/*
* 1.获取成员变止们
* Field[] getFields();获取所有public修饰的变量
* Field getField(String name )
* Field[] getDeclaredFields();获取所有的成员变量,不考虑修饰符
* Field getDeclaredField(String name)
*/
//获取成员变量们
Field[] fileds = personClass.getFields();
for (Field field : fileds) {
System.out.println(field);
}
System.out.println("---------");
Field a = personClass.getField("a");
//获取成员变量a的值
Person p = new Person();
Object value = a.get(p);
System.out.println(value);//null
//设置a的值
a.set(p, "aaaa");
System.out.println(p);
System.out.println("=============");
//Field[] getDeclaredFields()获取所有的成员变量,不考虑修饰符
Field[] declaredFields = personClass.getDeclaredFields();
for (Field field : declaredFields) {
System.out.println(field);
}
//Field getDeclaredField(String name)
Field c = personClass.getDeclaredField("c");//c为私有属性
//忽略访问权限修饰符的安全检查
c.setAccessible(true);//暴力反射,可以访问私有成员了
Object value2 = c.get(p);
System.out.println(value2);
c.set(p, 10);//将私有属性c的值修改成了10
System.out.println(p);
}
}
运行截图
获取成员方法们
Constructor<?>[] getConstructors()
Constructor<?> getConstructor(类<?>… parameterTypes)
Constructor<?> getDeclaredConstructor(类<?>… parameterTypes)
Constructor<?>[] getDeclaredConstructors()
package reflect;
import java.lang.reflect.Constructor;
import domain.Person;
public class ReflectDemo03 {
public static void main(String[] args) throws Exception{
/*
* 2.获取构造方法们
* Constructor<?>[] getConstructors()
* Constructor<T> getConstructor(类<?>... parameterTypes)
* Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
* Constructor<?>[] getDeclaredConstructors()
*/
Class personClass = Person.class;
Constructor ctor = personClass.getConstructor(String.class,int.class);
System.out.println(ctor);
//创建对象
Object person = ctor.newInstance("张三",20);
System.out.println(person);
System.out.println("----------");
//也可以使用下面的方法直接创建空参的对象
Object person2 = personClass.newInstance();
System.out.println(person2);
}
}
**3.获取成员方法们:
* Method[] getMethods()
* Method getMethod(String name,类<?>… parameterTypes)
* Method[] getDeclaredMethods()
* Method getDeclaredMethod(String name,类<?>… parameterTypes)
* **
package reflect;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import domain.Person;
public class ReflectDemo04 {
public static void main(String[] args) throws Exception {
/*3.获取成员方法们:
* Method[] getMethods()
* Method getMethod(String name,类<?>... parameterTypes)
* Method[] getDeclaredMethods()
* Method getDeclaredMethod(String name,类<?>... parameterTypes)
*
*/
Class personClass = Person.class;
//获取所有方法(不考虑修饰符)
Method[] methods = personClass.getDeclaredMethods();
for(Method method : methods){
String name = method.getName();//获取方法的名称
System.out.println(name);
}
System.out.println("=========");
//获取指定名称的方法
Method eat_method = personClass.getMethod("eat");//获取无参的eat方法
Person p = new Person();
//执行方法
eat_method.invoke(p);
Method eat_method2 = personClass.getMethod("eat", String.class);//获取有参的eat方法
eat_method2.invoke(p,"米饭");
// //访问私有方法的操作
// Method sleep_method = personClass.getMethod("sleep");
// sleep_method.setAccessible(true);
// sleep_method.invoke(p);
}
}