==================
反射:规则破坏者
可以通过反射来操作私有的方法和属性,还可以自动调用方法
反射获取字段是通过get/set方法 ,所以一定要写get/set方法
public class Test2
{
public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException
{
// 拿到类的描述符
Class<Person> clazz = Person.class;
System.out.println(clazz.getName());
//通过反射创建对象,前提是构造方法是public,如果不是private,那么请看下面
//Object object1= clazz.newInstance();
// 通过反射创建被private修饰的构造函数的类的对象
Constructor<Person> cons=clazz.getDeclaredConstructor();//获取声明的无参的构造函数描述
cons.setAccessible(true); //通过构造器,设置可访问性
Object object2=cons.newInstance(); //通过构造器创建一个类的实例,成功破坏构造的privte属性
System.out.println(object2); //但是这个对象是不能用的
//获取一个参数的构造函数描
// Constructor<Person> cons1=clazz.getDeclaredConstructor(int.class);
// cons1.setAccessible(true); //通过构造器,设置可访问性
// Object object3=cons1.newInstance(1000);//传入参数 ,获取对象
// System.out.println(object3); //但是这个对象是不能用的
//通过反射调用set方法,首先取得方法的声明,参数是String,所以是 String.class
Method method1=clazz.getDeclaredMethod("setName", String.class);
//获得setName的描述并且创建对象
Constructor<Person> constructor1= clazz.getDeclaredConstructor();
constructor1.setAccessible(true);
Object object4=constructor1.newInstance();
//方法承载在object4对象上 调用方法
method1.invoke(object4,"荒天帝");
// 通过反射调用get方法
Method method2=clazz.getDeclaredMethod("getName"); //获得getName的描述
//创建对象
Constructor<Person> constructor2= clazz.getDeclaredConstructor();
constructor2.setAccessible(true);
Object object5=constructor2.newInstance();
//承载在object4对象上,调用方法,如果是静态的方法invoke里直接填null
method2.invoke(object5);
//通过反射获取成员变量的数值(字段描述符)
Field field1= clazz.getDeclaredField("name"); //获取属性名
field1.setAccessible(true); //因为成员变量也是private,设置为可见
//创建对象
Constructor<Person>constructor3=clazz.getDeclaredConstructor();
constructor3.setAccessible(true);
Object object6=constructor1.newInstance();
//设置数值
field1.set(object6,"天帝");
//获取数值
Object my_name=field1.get(object6);
System.out.println(my_name);
// 通过反射获取函数和成员的修饰
Method method3 = clazz.getDeclaredMethod("setName", String.class);
int modifer = method3.getModifiers();// 运算符数值的总和 比如1是什么 2是什么, 4是什么 8是什么
System.out.println(modifer);
System.out.println(Modifier.isPublic(modifer));
System.out.println(Modifier.isPrivate(modifer));
// 遍历类里所有的方法
Method[] method4=clazz.getDeclaredMethods();//只能遍历指定类里的所有方法,继承过来的不算
for(Method m:method4)
{
System.out.println(m.getName());
}
System.out.println("==============");
Method[] method5=clazz.getMethods();//继承过来的也算,但是不算private,即使是在本类也不算private
for(Method m:method5)
{
System.out.println(m.getName());
}
}
}
class Person
{
private String name;
public Person(){}
public Person(int a){}
public String getName()
{
System.out.println("=====getName");
return name;
}
public void setName(String name)
{
System.out.println("=====setName");
this.name = name;
}
}