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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十四章 类型信息1(java的反射)相关的知识,希望对你有一定的参考价值。

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 }

 

以上是关于第十四章 类型信息1(java的反射)的主要内容,如果未能解决你的问题,请参考以下文章

我的学习之路_第十四章_反射

java:第十四章

包子学系列——Java基础第十五章_Java反射机制

#yyds干货盘点# Java 基础 - 反射机制详解

第十四章 instanceod 与 isInstance

on java 8 第十四章 流式编程