24-反射

24-反射

  • 反射机制:
    • 在运行状态中,对任意一个类,都能够知道这个类的所有属性和方法;
    • 对于任意一个对象,都能够调用他的任意一个方法和属性;
    • 这种动态获取以及动态的调用对象的功能称之为java的反射机制;
  • 功能:
    • 1.在运行时判断任意一个对象所属的类;
    • 2.在运行时构造任意一个类的对象
    • 3.在运行时判断任意一个类所具有的成员变量和方法
    • 4.在运行时调用任意一个对象的方法
    • 5.生成动态代理
  • 实现反射机制功能:
    • Class: 代表一个类, java.lang
    • Field: 代表类的成员变量(类的属性) java.lang.reflect
    • Constructor: 代表类的构造方法
    • Method: 代表类的方法
//User
public class User {
	private String name;
	private int age;
	public String gender;
	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 String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public User(String name, int age, String gender) {
		super();
		this.name = name;
		this.age = age;
		this.gender = gender;
	}
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + ", gender=" + gender + "]";
	}
}
//Test
public class Test {
	public static void main(String[] args) {
		User u1 = new User("清子", 26, "男");
		User u2 = new User("菲比", 27, "女");		//自定义类型
		
		//得到的时User类的类型,User类的类型是class.
		System.out.println(u1.getClass()==u2.getClass());
		System.out.println(u1.getClass());
		System.out.println(u2.getClass());
		//结果相等的原因: 因为他们都是User类创建出来的对象,getClass获取的是对象的类类型
		
		//数组
		int[] arrayA = new int[4];
		int[] arrayB = {11,22};
		//相等的原因,只要数组的类型相同,纬数相同,那么这个数据就具有了相同的class类型
		System.out.println(arrayA.getClass() == arrayB.getClass());
		int[][] arrayC = {{11,2}, {33, 44}};
		int[][] arrayD = {{}, {}};
		System.out.println(arrayC.getClass() == arrayD.getClass());
		System.out.println(arrayC.getClass());
		
		//基本数据类型
		System.out.println(int.class);
		System.out.println(double.class);
		System.out.println(boolean.class);
		System.out.println(char.class);
		System.out.println(void.class);
	}
}
  • class:
    • 获取class类和信息
import java.lang.reflect.Modifier;

public class ClassTest {
	public static void main(String[] args) throws ClassNotFoundException {
		//1.获取class的方式,三种方式
		//[1]对象名.getClass
		Class<?> cl1 = new User().getClass();
		//[2]类名.class
		Class<?> cl2 = User.class;
		//[3]class类中的一个静态方法
		Class<?> cl3 = Class.forName("deskdemo.User");		//静态方法中要写包名+类名
		
		System.out.println(cl1);
		System.out.println(cl2);
		System.out.println(cl3);
		
		//2.获取当前类的父类
		Class<?> cl4 = cl3.getSuperclass();
		System.out.println(cl4);
		
		//3.基本数据的包装类的获取方法
		Class<?> cl5 = Long.class;	//得到包名和类名
		Class<?> cl6 = Long.TYPE;		//得到的是类型
		System.out.println(cl5);
		System.out.println(cl6);
		
		//4.获取当前类的信息
		System.out.println("类的全名称: "+cl3.getName());		//得到的结果是包名和类名
		System.out.println("类的名称: "+cl3.getSimpleName());  //类名
		System.out.println("获取类的访问权限的字符串形式: "+Modifier.toString(cl3.getModifiers()));		//?
		
		//5.当前类的父类的信息
		Class<?> clas = cl3.getSuperclass();
		System.out.println("父类的类型: "+clas.getSuperclass());
		System.out.println("父类的全名称: "+clas.getSimpleName());
		System.out.println("父类的名称: "+clas.getSimpleName());
	}
}
  • 获取类的构造方法
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class GetConsTest {
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		//[1]获取class
		Class<?> cla = Class.forName("deskdemo.User");
		
		//[2]获取类中所有的构造方法
		Constructor<?> [] con = cla.getConstructors();
		for(Constructor<?> t: con) {
			System.out.println(t);
		}
		
		//[3]获取无参构造函数
		Constructor<?> con1 = cla.getConstructor();
		User user = (User) con1.newInstance();
		System.out.println(user);
		
		//[4]获取有参构造
		Constructor<?> con2 = cla.getConstructor(String.class, int.class, String.class);
		User user1 = (User) con2.newInstance("落天", 12, "男");
		System.out.println(user1);
	}
}
  • 获取类的属性
import java.lang.reflect.Field;

public class GetFieldDemo {
	public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException {
		//[1]获取Class对象
		Class<?> cla = Class.forName("deskdemo.User");
		
		//[2]获取公共的类的属性
		Field[] field = cla.getFields();
		for(Field f:field) {
			System.out.println(f);
		}
		
		//[3]根据名称获取属性
		Field field1 = cla.getField("gender");
		System.out.println(field1);
		Field field2 = cla.getDeclaredField("name");		//查找私有属性
		System.out.println(field2);
	}
}
  • 获取类中的方法
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class GetMethodDemo {
	public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		Class<User> cla = User.class;	//拿到user类的影子
		
		//[1]获取方法(本类中)
		Method[] me = cla.getDeclaredMethods();
		//遍历获取到的类中方法数组
		for(Method m:me) {
			System.out.println(m);
		}
		System.out.println("=================");
		
		//[2]获取到的时本类加父类中的方法
		Method[] me1 = cla.getMethods();
		//遍历
		for(Method m:me1) {
			System.out.println(m);
		}
		System.out.println("==================");
		
		//[3]根据名称获取方法
		Method method = cla.getMethod("toString");
		System.out.println(method);
		System.out.println("======================");
		
		Constructor<User> c = cla.getConstructor();		//获取到构造方法
		User user = c.newInstance();			//创建user对象
		String str = (String) method.invoke(user);		//执行user对象
		System.out.println(str);		//输出
		System.out.println("==============");
		
		Method method2 = cla.getMethod("setAge", int.class);    //方法,方法的参数
		method2.invoke(user, 22);
		System.out.println(user.getAge());
	}
}

猜你喜欢

转载自blog.csdn.net/qq_26270869/article/details/90174497