反射

1.反射概念

反射:指在程序运行过程中,动态的获取类信息,并且可以访问这些信息。

2.获取构造器

获取构造方法

代码演示

package com.qfedu.test2;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * 	通过反射获取到一个构造器对象
 * 	通过构造器对象创建一个本类对象
 * 	getConstructor 可以获取到public修饰的构造方法 不能获取到私有的 获取其他的修饰的构造方法
 * @author WHD
 *
 */
public class Test1 {
	public static void main(String[] args) {
		try {
			Class<?> stuClass = Class.forName("com.qfedu.test2.Student");
			Constructor<?> stuConstructor = stuClass.getConstructor(String.class,int.class);
			Constructor<?> constructor = stuClass.getConstructor();
			Object newInstance = stuConstructor.newInstance("赵四",17);
			Student stu = (Student) newInstance;
			System.out.println(stu.getName() + stu.getAge());
			
			Constructor<?>[] constructors = stuClass.getConstructors();
			for(Constructor cons : constructors) {
				System.out.println(cons.getName());
				System.out.println(cons.getParameterCount());
			}
			
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

class Student{
	private String name;
	private int age;
	
	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 Student(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public Student() {
	}

}
package com.qfedu.test1;

import java.lang.reflect.Constructor;

/**
 * 	使用反射获取private修饰的 默认修饰的 protected  public修饰的构造方法
 * 	getConstructors() public修饰的
 * 	getConstructor() 获取单个public修饰的
 * 	getDeclaredConstructors(); 获取所有的已定义的构造方法
 * 	getDeclaredConstructor(); 获取单个已定义的构造方法
 * @author WHD
 *
 */
public class Test1 {
	public static void main(String[] args) throws Exception {
		Class<?> stuClass = Class.forName("com.qfedu.test1.Student");
//		Constructor<?>[] cons = stuClass.getConstructors();
//		Constructor<?>[] cons1 = stuClass.getDeclaredConstructors();
//		System.out.println(cons.length);
//		System.out.println(cons1.length);
		
		Constructor<?> cons2 = stuClass.getDeclaredConstructor();
		System.out.println(cons2);
		cons2.setAccessible(true); // 忽略jvm的安全检查 使得我们可以访问私有修饰的构造方法
		Object newInstance = cons2.newInstance();
		System.out.println(newInstance);
	}
}

class Student{
	private String name;
	private int age;
	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;
	}


	Student(String name) {
		this.name = name;
	}
	public Student( int age) {
		this.age = age;
	}
	protected Student(String name, int age) {
		this.name = name;
		this.age = age;
	}
	private Student() {
		System.out.println("私有的无参构造");
	}

}

2.获取属性

代码演示

package com.qfedu.test2;

import java.lang.reflect.Field;

/**
 * 	获取public修饰的属性
 * 	getFileds() 获取所有的public修饰的属性 
* 	属性的方法
  * 	getFields() 获取public修饰的属性
  * 	getField() 获取单个public修饰的属性
  * 	getDeclaredFields() 获取所有的
  * 	getDeclaredField() 获取单个的属性
 * @author WHD
 *
 */
public class Test2 {
	public static void main(String[] args) throws Exception {
		Class<?> personClass = Class.forName("com.qfedu.test2.Person");
		Field[] fields = personClass.getFields();
		for(Field f : fields) {
			System.out.println(f.getName() );
			System.out.println(f.getType());
		}
		
		Object newInstance = personClass.newInstance();
		Field nameField = personClass.getField("name");
		nameField.set(newInstance, "赵四");
		System.out.println(nameField.get(newInstance));
		
		
	}
}

class Person{
	public String name;
	public int age;
	protected String address;
}

3.获取方法

代码演示

package com.qfedu.test2;

import java.lang.reflect.Method;

/**
 * 	获取所有公开的方法
 * 	getMethods() 获取所有public修饰的 和 继承自父类方法
 * @author WHD
 *
 */
public class Test3 {
	public static void main(String[] args) throws Exception {
		Class<?> carClass = Class.forName("com.qfedu.test2.Car");
		Method[] methods = carClass.getMethods();
		for(Method m : methods) {
			System.out.println(m.getName());
		}
		Object newInstance = carClass.newInstance();
		Method method = carClass.getMethod("m1");
		method.invoke(newInstance);
		
		Method method2 = carClass.getMethod("m1",int.class);
		method2.invoke(newInstance, 20);
	}
}

class Car{
	public void m1() {
		System.out.println("Car类的m1方法");
	}
	
	public void m1(int a) {
		System.out.println("Car类的有参数的m1方法" + a);
	}
	
	public void m1(double a) {
		
	}
	
	public void m2() {
		System.out.println("Car类的m2方法");
	}
}
package com.qfedu.test1;

import java.lang.reflect.Method;

/**
 * 	获取方法
 * 	getMethods() 获取所有public 修饰的 和继承自父类 的方法
 * 	getMethod() 获取单个 public修饰的或者继承自父类 的方法
 * 	getDeclaredMethods() 获取已定义的所有的方法
 * 	getDeclaredMethod() 获取单个已定义的方法
 * @author WHD
 *
 */
public class Test2 {
	public static void main(String[] args) throws Exception {
		Class<?> stuClass = Class.forName("com.qfedu.test1.Student1");
//		Method[] methods = stuClass.getMethods();
//		System.out.println(methods.length);
//		for (Method method : methods) {
//			System.out.println(method.getName());
//		}
//		Method[] declaredMethods = stuClass.getDeclaredMethods();  获取所有已定义 4个
//		System.out.println(declaredMethods.length);
		Object newInstance = stuClass.newInstance();
		Method m = stuClass.getDeclaredMethod("m2");
		m.setAccessible(true);
		m.invoke(newInstance);
		Method m1 = stuClass.getDeclaredMethod("m2", int.class);
		m1.setAccessible(true);
		m1.invoke(newInstance, 20);
	}
}
class Student1{
	void m1() {
		System.out.println("默认修饰的方法m1");
	}
	
	private void m2() {
		System.out.println("私有修饰的方法m2");
	}
	
	private void m2(int a) {
		System.out.println("私有修饰的方法m2" + a);
	}
	
	protected void m3() {
		System.out.println("protected修饰的方法m3");
	}
	
	public void m4() {
		System.out.println("public修饰的方法m4");
	}
	
}
posted @ 2021-09-04 16:04  码丁XIA  阅读(223)  评论(0)    收藏  举报