JAVA之反射

本文深入讲解Java反射机制,包括如何通过不同方式获取class文件对象,获取构造方法进行对象创建,获取成员变量并赋值,以及调用成员方法。通过实例演示了反射在获取类信息和动态操作对象方面的强大功能。

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

一:获取class文件对象
1.通过对象获取
2.通过类获取
3.通过class中的静态方法获取(Class.ForName()常用)
//通过对象获取
Person p=new Person();
//获取Person类的class文件对象
Class<? extends Person> c1 = p.getClass();
//全类名
System.out.println(c1);
//通过类获取
Class c2=Person.class;
System.out.println(c2);
//常用获取(只需要一个字符串 就能获取该类的class对象 )
//注意:参数需写全类名 包名+类名
Class<?> c3 = Class.forName(“com.lanou3g.reflect.Person”);
System.out.println(c3);
二:获取构造方法
//通过class文件对象 获取类中构造方法
Class<?> c = Class.forName(“com.lanou3g.reflect.Person”);
//获取所有public共有的构造方法
Constructor<?>[] constructors = c.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
}
//获取单个构造方法
Constructor<?> constructor = c.getConstructor();
//利用该构造方法创建对象
Object object = constructor.newInstance();
System.out.println(object);
//public Person(String name, int age) 有参构造创建对象(参数是参数类文件类型)
Constructor<?>constructor2 = c.getConstructor(String.class,int.class);
//创建对象
Object object2 = constructor2.newInstance(“zhangfei”,36);
System.out.println(object2);
三:通过class文件对象 快速创建对象
前提:1.类必须用public
2.必须提供无参构造方法
3.该无参构造方法必须是public修饰
Class<?> c = Class.forName(“com.lanou3g.reflect.Person”);
//快速创建对象(直接使用类中无参构造方法)
Object object = c.newInstance();
System.out.println(object);
四:获取类的私有构造方法
Class<?> c = Class.forName(“com.lanou3g.reflect.Person”);
Constructor<?>[] constructors = c.getDeclaredConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
}
//获取私有的构造方法
Constructor<?> constructorP = c.getDeclaredConstructor(int.class,String.class);
//打开私有方法使用权限
constructorP.setAccessible(true);
//创建对象
Object object = constructorP.newInstance(50,“赵云”);
System.out.println(object);
五:获取所有成员变量
Class<?> c =Class.forName(“com.lanou3g.reflect.Person”);
Field[] fields = c.getFields();
for (Field field : fields) {
System.out.println(field);
//单独获取指定成员变量
Field field2 = c.getField(“name”);
//创建一个person
Object object = c.newInstance();
//通过反射 给该属性赋值
field2.set(object, “毛毛”);
System.out.println(object);
//获取私有成员变量age 并赋值打印
Field field3 = c.getDeclaredField(“age”);
field3.setAccessible(true);
field3.set(object, 56);
System.out.println(object);
六:利用反射调用成员方法
Class<?> c = Class.forName(“com.lanou3g.reflect.Person”);
//获取类中所有的公开方法(包括父类)
Method[] methods = c.getMethods();
for (Method method : methods) {
System.out.println(method);
}
//获取指定的成员方法
//参数1:获取的方法名字
//参数2:获取的方法的参数的class类型
Method method = c.getMethod(“eat”);
System.out.println(method);
Object object = c.newInstance();
//调用该方法
//参数1:调用该方法的对象
//参数2:调用该方法 要传入的参数
//返回值:调用该方法的返回值
Object invoke = method.invoke(object);
System.out.println(invoke);
Method method2 = c.getMethod(“speak”, String.class);
Object invoke2 = method2.invoke(object, “国语”);
System.out.println(invoke2);
Method method3 = c.getDeclaredMethod(“play”, String.class);
//开启权限
method3.setAccessible(true);
//调用方法
Object object2 = method3.invoke(object, “游戏”);
System.out.println(object2);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值