第十四章 类型信息1(java的反射)

本文详细介绍了Java反射机制的使用方法,包括如何通过反射获取构造方法、成员方法及成员变量,并提供了具体的代码示例。

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

1.java语言的反射

 1 package cn.itcast_01;
 2 /* 1.通过反射获取构造方法并使用
 3  *         // 获取字节码文件对象
 4         Class c = Class.forName("cn.itcast_01.Person");
 5         //获取指定的构造器对象(仅仅是获取到了)
 6             该方法的形式参数就是构造方法的形式参数的.class对象(Class<?>... parameterTypes)
 7  *             parameterTypes 参数是 Class 对象的一个数组
 8         Constructor con = c.getDeclaredConstructor(String.class);
 9         //使用构造器创建类的实例对象
10          //con.setAccessible(true);取消语言访问检查
11           Object obj = con.newInstance("风清扬");
12  * 2.通过反射获取成员方法并使用
13  *         // 获取字节码文件对象
14         Class c = Class.forName("cn.itcast_01.Person");
15         Constructor con = c.getConstructor();
16         Object obj = con.newInstance();
17         // public Method getMethod(String name,Class<?>... parameterTypes)
18         // 第一个参数表示的方法名,第二个参数表示的是方法的参数的class类型
19         //获取成员方法对象
20         Method m1 = c.getMethod("show");
21         Method m2 = c.getMethod("method", String.class);
22         //通过该对象调用成员方法
23          m1.invoke(obj); // 调用obj对象的m1方法
24          m2.invoke(obj, "hello");//调用obj对象的m2方法
25  * 3.通过反射获取成员变量并使用
26  *         // 获取单个的成员变量
27  *         Field addressField = c.getField("address");
28  *         //给指定变量赋值
29  *         addressField.set(obj, "北京");
30  * 
31  *        //取消语言访问检查
32  *        addressField.setAccessible(true);
33  *        con.setAccessible(true);
34  *        m1.setAccessible(true);
35  */
36 public class ReflectDemo {
37 
38 }

 2.获取构造函数对象并使用

 1 package cn.itcast_01;
 2 
 3 import java.lang.reflect.Constructor;
 4 
 5 public class ReflectDemo2 {
 6     public static void main(String[] args) throws Exception {
 7         //Class类  public final class Class<T>extends Object
 8         //获取类的字节码文件对象
 9         /*    1.static Class<?> forName(String className) 
10          *     2.public final Class<?> getClass()
11          *     3.例如,String.class 的类型是 Class<String>。
12          */
13          //获取字节码文件对象
14         Class c = Class.forName("cn.itcast_01.Person");
15         //获取构造方法对象
16          /*    1.Constructor<T> getConstructor(Class<?>... parameterTypes) 
17                  获取指定参数的公共构造器对象
18           * 2. Constructor<?>[] getConstructors() 
19                  获取所有公共构造器对象
20              3. Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 
21                  获取指定参数的构造器对象
22              4.Constructor<?>[] getDeclaredConstructors() 
23                  获取所有构造器对象
24           */
25         //获取构造器对象
26         //Constructor con = c.getConstructor();//无参构造
27         Constructor con = c.getDeclaredConstructor(String.class,int.class);
28         //使用构造器对象调用构造方法
29         Object obj = con.newInstance("张三",22);
30         Person p = (Person) con.newInstance("张三",22);
31         System.out.println(obj);//Person [name=张三, age=22]
32         System.out.println(p);//Person [name=张三, age=22]
33     }
34 }

3.获取普通成员方法

 1 package cn.itcast_01;
 2 import java.lang.reflect.Constructor;
 3 import java.lang.reflect.Method;
 4 public class ReflectDemo3 {
 5     @SuppressWarnings("unchecked")
 6     public static void main(String[] args) throws Exception {
 7         //获取类的字节码文件对象
 8         Class c = Class.forName("cn.itcast_01.Person");
 9         //获取构造器对象
10         Constructor con = c.getDeclaredConstructor();
11         //创建新实例
12         Object obj = con.newInstance();
13         /* 通过字节码文件对象获取成员方法对象:
14          *     1.Method getMethod(String name, Class<?>... parameterTypes) 
15          *     2.Method[] getMethods() 
16          *     3.Method getDeclaredMethod(String name, Class<?>... parameterTypes) 
17          *           返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
18          *     4.Method[] getDeclaredMethods() 
19          *         返回Method对象的一个数组,包括私有和公有的方法,继承的除外
20          */
21         //Method[] m = c.getDeclaredMethods();
22         //获取成员方法对象(参数列表:方法名,方法形参的.class对象)
23         Method m1 = c.getDeclaredMethod("show");
24         //使用成员方法对象
25         m1.invoke(obj);//show方法
26         //获取成员方法对象
27         Method m2 = c.getDeclaredMethod("method", String.class);
28         //使用该方法
29         m2.setAccessible(true);
30         m2.invoke(obj, "张三");//张三的method方法
31         System.out.println(m2.getName());
32     }
33 }

4.获取字段属性

 1 package cn.itcast_01;
 2 import java.lang.reflect.Constructor;
 3 import java.lang.reflect.Field;
 4 
 5 public class ReflectDemo4 {
 6     public static void main(String[] args) throws Exception {
 7         //获取类的字节码文件对象
 8         Class c = Class.forName("cn.itcast_01.Person");
 9         //获取构造器对象
10         Constructor con = c.getDeclaredConstructor();//无参构造器
11         //创建类的新实例(使用无参构造器)
12         Object obj = con.newInstance();
13         //获取Field对象
14         /*    1.Field getDeclaredField(String name) 
15          *     2.Field[] getDeclaredFields() 
16          *     3.Field getField(String name) 
17          *     4.Field[] getFields() 
18          */
19         Field nameField = c.getDeclaredField("name");
20         Field ageField = c.getDeclaredField("age");
21         //给Field对象赋值(必须制定对象)
22         nameField.setAccessible(true);
23         ageField.setAccessible(true);
24         nameField.set(obj, "张三");
25         ageField.set(obj, 22);
26         System.out.println(obj);//Person [name=张三, age=22]
27     }
28 }

 

转载于:https://www.cnblogs.com/syg13129953117/p/8000684.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值