反射:reflection

本文深入讲解Java反射机制的基础概念及应用场景,包括如何通过不同方式获取类的信息、利用反射进行对象属性和方法的操作等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反射reflection

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制(即通过对象查找类的详细信息)。

反射机制的作用

1.反编译:  .class  ---->>  .java;
2.通过反射机制访问Java对象的属性和方法,构造方法等;


反射机制中的常用类

java.lang.Class;                
java.lang.reflect.Constructor;
java.lang.reflect.Field;        
java.lang.reflect.Method;
java.lang.reflect.Modifier;

通过反射机制获取类的三种方式:

1.通过类名.class的方式得到
2.通过对象.getClass()方法获取
3.通过forName()的方式获取,需要传入完整包.类名称的路径,可能抛出ClassNotFoundException异常


Class<?> class0 = Person.class ;//通过.class的方法取得类的信息
Class<?> class2 = new Person().getClass();//通过.getClass()的方法取得类的信息
Class<?> class1 = null ;
try {
	class1 = Class.forName("study1102.Person");//通过.forName()的方法取得类的信息
} catch (ClassNotFoundException e) {
	e.printStackTrace();
}




反射中的常用方法:

.getInterface() ;取得一个类的所有接口
.getSuperclass() ;取得一个类继承的父类
.getConstructors() ;取得一个类的构造方法
.getMethods() ;取得一个类的全部方法
.getDeclaredFields() ;取得一个类的全部属性

.getModifiers() ; 取的构造方法的修饰符;

注:返回一个int类型的数值,可以使用Modifier类中的toString()方法转换成String类型的访问权限

.newInstance() ; 实例化对象


Demo:

定义一个person类,使用反射中常用方法取得信息

/**
 * 定义一个接口作为练习使用
 * @author SUMMER
 */
interface PersonInterface{
	
}

/**
 * 定义一个人的类作为练习使用
 * @author SUMMER
 */
public class Person implements PersonInterface {
	
	private String name ;//姓名
	
	private int age ;//年龄
	
	public Person() {//无参构造
		
	}
	
	public Person(String name) {//带一个String类型的构造方法
		this.name  = name ;
	}
	
	public Person(String name , int age) {//带二个参数的构造方法
		this.name = name ;
		this.age = age ;
	}

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * @return the age
	 */
	public int getAge() {
		return age;
	}

	/**
	 * @param age the age to set
	 */
	public void setAge(int age) {
		this.age = age;
	}

	public static void teststatic() {
		System.out.println("Person类中的静态方法");
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}

}

通过反射取得当前类中的接口信息,父类,所有属性,所有方法,并实例化


import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;

/**
 * 用于取得对象信息
 * @author SUMMER
 */
public class GetReflectionInfo {

	/**
	 * 取得当前类中的所有接口信息
	 */
	public static void getInterfaceInfo() {
		Class<?> classe = Person.class ;//通过.class的方法取得类的信息
		Class<?>[] classes = classe.getInterfaces();
		System.out.println("取得当前类中的所有接口信息:"+Arrays.toString(classes));
	}
	
	/**
	 * 取得当前类中的父类信息
	 */
	public static void getSuperclassInfo() {
		Class<?> classe = null ;
		try {
			classe = Class.forName("study1102.Person");//通过.forName()的方法取得类的信息
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Class<?> classes = classe.getSuperclass();
		System.out.println("取得当前类中的父类信息:"+classes);
	}	
	
	/**
	 * 取得当前类中的所有构造方法信息
	 */
	public static void getConstructorsInfo() {
		Class<?> classe = null ;
		classe = new Person().getClass();//通过.getClass()的方法取得类的信息
		Constructor<?>[] constructors = classe.getConstructors();
		System.out.println("取得当前类中的所有构造方法信息:"+Arrays.toString(constructors));
		for (Constructor<?> constructor : constructors) {
			System.out.println("----------------------------");
			System.out.println("当前构造方法的方法名:"+constructor.getName());
			System.out.println("当前构造方法的访问权限:"+Modifier.toString(constructor.getModifiers()));
			//constructor.getModifiers()取得了一个int类型的返回值,则可以调用Modifier中的toString()将int类型的数值转换成一个String类型的访问权限
			System.out.println("当前构造方法的参数类型"+Arrays.toString(constructor.getParameterTypes()));
		}
	}
	
	/**
	 * 取得当前类中的所有方法信息
	 */
	public static void getMethodsInfo() {
		Class<?> classe = Person.class ;//通过.class的方法取得类的信息
		Method[] methods = classe.getMethods();
		System.out.println("取得当前类中的所有方法信息:");
		for (Method method : methods) {
			System.out.println(method);
		}
	}
	
	/**
	 * 取得当前类中的所有属性信息
	 */
	public static void getDeclaredFieldsInfo() {
		Class<?> classe = Person.class ;//通过.class的方法取得类的信息
		Field[] fields = classe.getDeclaredFields();
		System.out.println("取得当前类中的所有属性信息:"+Arrays.toString(fields));
	}
	
	/**
	 * 通过constructor类实例化对象
	 */
	public static void getNewInstance() {
		Person person = null ;
		try {
			person = Person.class.newInstance() ;
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}//通过.class的方法取得类的信息
		person.setName("zhangdandan");
		person.setAge(18);
		System.out.println("通过constructor类实例化对象:"+person);
	}
	
	/**
	 * 主方法
	 * @param args
	 */
	public static void main(String[] args) {
		getInterfaceInfo();
		System.out.println("#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*");
		getSuperclassInfo();
		System.out.println("#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*");
		getConstructorsInfo();
		System.out.println("#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*");
		getMethodsInfo();
		System.out.println("#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*");
		getDeclaredFieldsInfo();
		System.out.println("#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*");
		getNewInstance();
	}
}


通过反射为对象赋值,修改指定属性内同,调用普通方法,静态方法


import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 使用反射为对象赋值,修改值,调用指定方法
 * @author SUMMER
 */
public class SetterGetterReflection {
	public static void main(String[] args) {
		Class<?> classe = Person.class ;//初始化Person类
		Object object = null ;//定义一个object类型的引用
		
		try {
			
			
			object = classe.newInstance();//实例化一个Person类的对象
			Method method = classe.getMethod("setName", String.class);//取得Person类中的setName()方法
			Method method2 = classe.getMethod("setAge", int.class);//取得Person类中的setAge()方法
			method.invoke(object, "zhangsan");//使用Person类对象调用setName()方法并设置值
			method2.invoke(object, 15);//使用Person类对象调用setAge()方法并设置值
			System.out.println("当前对象内容"+object);//打印当前对象
			
			
			Field field = classe.getDeclaredField("name");//取得Person类中的name属性
			field.setAccessible(true);//设置当前反射的属性在使用时取消 Java 语言访问检查,修改访问权限为public
			field.set(object, "lisi");//为当前属性赋值
			System.out.println("当前对象内容"+object);//打印当前对象
			
			
			Method method3 = classe.getMethod("teststatic");//取得Person类中的静态方法
			method3.invoke(classe);//直接使用初始化完成的Person类对象调用此方法
			//method3.invoke(object);//也可以使用对象调用静态方法,但使用类名调用更加合理
			
			
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值