_071_反射之操作方法、属性

==================

反射:规则破坏者

可以通过反射来操作私有的方法和属性,还可以自动调用方法

反射获取字段是通过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;
	}
}

猜你喜欢

转载自blog.csdn.net/yzj17025693/article/details/82813188
今日推荐