java反射机制和使用

1.什么是反射?有什么用?

在java运行过程种,任何一个类,我们都能获得它的属性和方法,任何一个对象我们都能调用它的属性和方法,这种动态获取信息和动态调用对象属性方法的功能被称为java反射机制。
总的来说,反射就是将java类中的各种成分映射成一个个的java对象
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是jvm中有N多的实例每个类都有该Class对象。

2.使用

我们首先要获取class对象,才能获取该类的所有属性和方法。

1.获取class对象的方式

(1) 通过 对象.getClass() 比如:student.getClass()
(2) 任何类都有一个静态的class属性,通过类名.class来获取,比如:int.class,Student.class
(3) 通过Class类的静态方法:Class.forName(“Student”)

通常我们使用第三种方式,因为可以直接通过出入一个类路径字符串就可以了。第一种还需要创建一个对象,第二种需要引入相关类的包。

2.通过反射获取方法和变量并调用

创建一个student对象:包含3个构造方法,4个成员变量和成员方法

public class Student {
     
	public String name;	
	protected int age;	
	char sex;	
	private String phoneNum;
	
	public Student() {
     
		System.out.println("无参构造方法");
	}
	public Student(String str) {
     
		System.out.println("默认构造方法"+str);
	}
	public Student(String name,int age) {
     
		System.out.println("姓名"+name+" 年龄"+age);
	}
	
	public void show1(String s){
     		
		System.out.println("调用了:公有的,String参数的show1(): s = " + s);	
	}	
	protected void show2(){
     		
		System.out.println("调用了:受保护的,无参的show2()");	
	}	
	void show3(){
     		
		System.out.println("调用了:默认的,无参的show3()");	
	}	
	private String show4(int age){
     		
		System.out.println("调用了,私有的,并且有返回值的,int参数的show4(): age = " + age);		
		return "abcd";	
	}
	
	@Override	
	public String toString() {
     		
		return "Student [name=" + name + ", age=" + age + ", sex=" + sex + ", phoneNum=" + phoneNum + "]";	
	}

}

反射调用方法:

  1. 通过Class.forName()获取class对象
  2. 通过getConstructor()方法获取特定的构造方法,参数列表传入所有参数;通过class对象Constructor接受获取的构造方法,调用newInstance创建该类的实例
  3. 通过getMethod()方法获取成员方法,通过m.invoke()调用成员方法,传入该对象的实例和成员方法的参数
  4. 通过getField()方法获取指定的成员变量,调用成员变量的set方法为该对象的成员设置值。
public class FanSeMethod {
     

	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
     
		//1.获取class对象
		Class clazz = Class.forName("FanSe.Student");
		
		//2.获取构造方法(特定的构造方法,传入参数class对象)
		Constructor con = clazz.getConstructor(String.class,int.class);
		
		//3.通过构造方法调用newInstance创建对象
		Object obj = con.newInstance("张三",4);
		System.out.println(obj);
		
		//4.获取成员方法(获取特定的成员方法,传入方法名,和参数class对象)
		Method m = clazz.getMethod("show1", String.class);
		//通过m.invok去调用该obj对象的方法
		m.invoke(obj, "张三");
		
		//5.获取成员变量
		Field f = clazz.getField("name");
		f.set(obj, "张三");
		System.out.println(obj);
	}
}

你可能感兴趣的:(java基础)