反射-Class对象获取方式

反射是什么? JAVA反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java的反射机制
要想解剖一个类,必须获取它的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象。

反射就是把java类中的各种成分映射成一个个Java对象
加载的时候,就是我们把class文件读入内存,并为之创建一个class对象

获取class对象的三种方式:
1.Object->getClass()
2.任何数据类型都有一个“静态”的class属性
3.通过class类的静态方法: clazz.forName

package fanshe;

/**

  • 获取Class对象的三种方式
  • 1 Object ——> getClass();
  • 2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
  • 3 通过Class类的静态方法:forName(String className)(常用)

*/

public class Fanshe {
	public static void main(String[] args) {
		//第一种方式获取Class对象  
		Student stu1 = new Student();//这一new 产生一个Student对象,一个Class对象。
		Class stuClass = stu1.getClass();//获取Class对象
		System.out.println(stuClass.getName());
		
		//第二种方式获取Class对象
		Class stuClass2 = Student.class;
		System.out.println(stuClass == stuClass2);//判断第一种方式获取的Class对象和第二种方式获取的是否是同一个
		
		//第三种方式获取Class对象
		try {
			Class stuClass3 = Class.forName("fanshe.Student");//注意此字符串必须是真实路径,就是带包名的类路径,包名.类名
			System.out.println(stuClass3 == stuClass2);//判断三种方式是否获取的是同一个Class对象
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}

注意:在运行期间,一个类只有一个class对象产生
三种方式常用第三种,第一种对象都有了还要反射干锤子。第二种需要导入类的包,依赖太强,不导包就抛编译错误。一般第三种,一个字符串可以传入也可以在配置文件写多种方法

Object.getClass(): 返回一个对象的运行时类(不常用)

获取构造方法并使用
获取成员变量并使用
获取成员方法并使用

常用的方法:
getConstructors(): 获取所有“公有的”构造方法
getDeclaredConstructors(): 获取所有的构造方法(包括私有,受保护,默认,公有地)
getMethod();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用反射获取对象并操作属性。下面是一个示例代码,演示了如何使用反射获取类的实例并操作其属性: ```java import java.lang.reflect.Field; public class ReflectionExample { public static void main(String[] args) { // 创建一个对象 MyClass obj = new MyClass(); // 获取对象的类 Class<?> objClass = obj.getClass(); try { // 获取属性 Field field = objClass.getDeclaredField("myField"); // 打开访问权限 field.setAccessible(true); // 获取属性的值 Object value = field.get(obj); System.out.println("原始值:" + value); // 设置属性的值 field.set(obj, "新的值"); // 再次获取属性的值 value = field.get(obj); System.out.println("修改后的值:" + value); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } } class MyClass { private String myField = "初始值"; } ``` 在上面的示例代码中,我们首先创建了一个 MyClass对象 obj。然后通过 obj.getClass() 方法获取了 obj 对象的类,即 MyClass 类的 Class 对象 objClass。接下来,使用 objClass.getDeclaredField("myField") 方法获取了名为 myField 的私有字段。为了能够访问私有字段,我们通过 field.setAccessible(true) 打开了访问权限。然后,通过 field.get(obj) 方法获取了 myField 的原始值,并打印输出。接着,使用 field.set(obj, "新的值") 方法设置了 myField 的新值。最后,再次使用 field.get(obj) 方法获取 myField 的新值,并打印输出。 需要注意的是,反射操作可能会影响代码的性能和可读性,因此应该谨慎使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值