java反射介绍及代码

反射

获取反射

//第一种获取方式,主要是获取信息
Class clazz =Class.forName("包名.类名");
//第二种获取方式,用来传递参数
Class clabb=类名.class;
//第三种获取方式,不推荐使用
Cat cat =new Cat();
Class clacc=cat.getClass();

获取的反射类型

  • Field 获取的是变量
  • Method[]获取的方法
  • Constructor[]获取的是构造器

public 类型 的变量、方法、构造器获取

变量

1.关于获取全局变量
类对象名称.getFields(); // Field[]数组进行接收 只能获取由public修饰的变量
类对象名称.getDeclaredFields(); // Field[]数组进行接收 能获取所有的变量
类对象名称.getField(“指定的变量”) // Field 进行接收 只能获取由public修饰的变量
类对象名称.getDeclaredField(“指定的变量”); // Field数组进行接收 能获取所有的变量
2.Field成员变量的基本操作
1.设置值 set(Object obj,Object value)
①:new出我们的对象 :我们需要给赋的值内存空间进行表达
②:判断我们所获取的变量是不是private类型的,如果是必须使用暴力反射 : setAccessible(true);
②:调用set()方法,传递两个参数,第一个我们new出来的对象,第二个使我们想要付的值
2.获取值 get(Object obj)
①:new出我们的对象:我们需要给赋的值内存空间进行表达
②:判断我们所获取的变量是不是private类型的,如果是必须使用暴力反射 : setAccessible(true);
③:调用get()方法并且将创建出来的对象当成参数进行传递,用Object来进行返回值的接收

	Class c1=Class.forName("包名.Dog");
	//获取public值
	Field f1=c1.getField("age");
	Dog dog=new Dog();//创建对象
	Object o=f1.get(dog);
	System.out.println(o);	
	//获取private值
	Field f2=c1.getDeclaredField("name");
	f2.setAccessible(true);
	Object o2=f2.get(dog);
	System.out.println(o2);
	//获取所有public变量
	Field[] f4=c1.getFields();
	for(Field field:f4) {
		System.out.println(field);
	}
    //获取所有的变量 包括private
	Field[] f4=c1.getDeclaredFields();
	for(Field field:f4) {
		System.out.println(field);
	}
	//设置private值
	Field f3=c1.getDeclaredField("sex");
	f3.setAccessible(true);//设置private的值需要这一步骤获得允许
	f3.set(dog, '女');
	Object o3=f3.get(dog);
	System.out.println(o3);
    //设置public值
	Field f4=c1.getDeclaredField("age");
	f4.set(dog, 12);
	Object o3=f4.get(dog);
	System.out.println(o3);

方法

1.关于获取方法
类对象名称.getMethods(); //Method[]数组进行接收 只能获取由public修饰的方法
类对象名称.getDeclaredMethods(); //Method[]数组进行接收 获取由所有的的方法
类对象名称.getMethod(“制定的方法名称”,参数类型.class…); //Method进行接收 只能获取由public修饰的方法
类对象名称.getDeclaredMethod(“制定的方法名称”,参数类型.class …); //Method数组进行接收 获取由所有的的方法
2.关于对方法的操作 invoke() //对方法的执行
①:new出我们的对象 :我们需要给方法内存空间进行表达
②:判断我们所获取的方法是不是private类型的,如果是必须使用暴力反射 : setAccessible(true);
②:调用invkoe()方法,传递两个参数,第一个我们new出来的对象,第二个使我们想要付的值

	//获取public方法,用invoke()方法调用
	Method m1=c1.getMethod("run");
	System.out.println(m1);
	m1.invoke(dog);
	//获取private类型方法,用invoke()调用,带参方法的获取调用如下
	Method m2=c1.getDeclaredMethod("eat",String.class);
	m2.setAccessible(true);
	m2.invoke(dog, "小明");
	//获取所有的方法,包括private
	Method[] m3=c1.getDeclaredMethods();
	for(Method m:m3) {
		System.out.println(m);
	}
	//获取所有public方法
    Method[] m3=c1.getMethods();
	for(Method m:m3) {
		System.out.println(m);
	}

构造器

三、关于构造器
类对象名称.getConstructors(); // Constructor[]数组进行接收 只能获取由public修饰的构造器
类对象名称.getDeclaredConstructors(); // Constructor[]数组进行接收 能获取所有的构造器
类对象名称.getConstructor(参数类型.class) //
类对象名称.getDeclaredConstructor(参数类型.class);

  1. 使用newInstance()进行初始化赋值
	//获取所有public构造器
	Constructor[] s1=c1.getConstructors();	
	for(Constructor s:s1) {
		System.out.println(s);
	}
	//获取所有构造器,包括private
	Constructor[] s2=c1.getDeclaredConstructors();
	for(Constructor s:s2) {
		System.out.println(s);
	}
	//获取带参数public构造器并赋值
	Constructor s3=c1.getConstructor(Integer.class);
	Object o4=s3.newInstance(12);
	System.out.println(o4);
	
	//获取带参数private构造器并赋值
	Constructor s4=c1.getDeclaredConstructor(Integer.class,String.class);
	s4.setAccessible(true);
	Object o5=s4.newInstance(11,"小绿");
	System.out.println(o5);

版权声明:本文为PDyee原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>