第十四章 类型信息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 }
时间: 2024-10-30 09:23:28

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

《JAVA编程思想》学习笔记——第十四章 类型信息

运行时类型信息使得你可以在程序运行时发现和使用类型信息. 主要有两种方式:一种是"传统的"RTTI, 它假定我们在编译时已经知道了所有的类型;另一种是"反射"机制,它允许我们在运行时发现和使用类的信息. Class对象 类是程序的一部分,每个类都有一个Class对象.换言之,每当编写并且编译一个新类,就会产生一个Class对象(更恰当的说,是被保存在一个同名的.class文件中).为了生成这个类的对象,运行这个程序的Java虚拟机(JVM)将使用被称为"类

第十四章 类型信息

前言 在开始介绍类型信息之前一定要区分一些概念: 1.静态类型语言与动态类型语言 静态类型语言:在编译期进行类型检查的语言(例如,Java).(例如 int i = 3;) 动态类型语言:在运行期进行类型检查的语言(例如,JavaScript).最明显的特征为变量没有类型值有类型(如,var=3;) 2.类型检查与类型转换(在Java中的区别) 类型检查:发生在编译期,检查方法是不是接收到了合适类型的参数,赋值是不是有合适类型的右值. 类型转换正确性检查:发生在运行期,检查一个类型变换到另外一个

Java编程思想——第14章 类型信息(二)反射

六.反射:运行时的类信息 我们已经知道了,在编译时,编译器必须知道所有要通过RTTI来处理的类.而反射提供了一种机制——用来检查可用的方法,并返回方法名.区别就在于RTTI是处理已知类的,而反射用于处理未知类.Class类与java.lang.reflect类库一起对反射概念进行支持,该类库包含Field.Method以及Constructor(每个类都实现了Member接口).这些类型是由JVM运行时创建的,用来表示未知类种对应的成员.使用Constructor(构造函数)创建新的对象,用ge

Java-第十四章-代参的方法(二)-编程实现,输入班里10名学生的身高,获得身高最高的学生要求对象数组类型方法

package com.ww.yzpA; public class Students { int No; int Height; } package com.ww.yzpA; public class Height { public Students getMaxHeigth(Students[] str) { Students A = new Students(); for (int i = 0; i < str.length; i++) { if (str[i].Height > A.He

Java(第十四章)

第十四章 1.Java中的包(package) 2.1 包,对应到磁盘中的文件夹 2.2 新建一个class,默认保存在缺省包中 2.3 声明包的关键字:package package语句,置顶位置 2.4 导入包的关键字:import import 包名.类名(*表示所有); 2.5 作用: 分类存放,解决同名冲突.方便查找和管理 2.6 命名规范 l  Java包名通常由小写字母组成,不能以圆点开头或结尾. l  一个唯一包名的前缀通常是全部小写的ASCII字母,并且是一个顶级域名com.e

c++第十四章-(类型强转换)

类型强转换有2种. class Company { public: Company(std::string theName,std::string theProduct); virtual void printInfo(); protected: std::string name; std::string product; }; Company::Company(std::string theName,std::string theProduct) { this->name = theName;

java:第十四章

十四章 1.方法定义 public 返回值类型 方法名(参数类型1 参数名1,参数类型2 参数名2···){ //方法体 } 2.有参数的调用 a.如果同一个类中,方法可以直接调用. b.如果是不同的类,方法必须通过对象调用, 对象名,方法名(实参1,实参2···); 注意:1.实参的数据类型,参数的个数,参数的顺序要与形参保持一致 2.调用返回值的方法,一般要接收返回值,并作出相应的处理. public class Excelle { private String type; private

“全栈2019”Java第四十四章:继承

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第四十四章:继承 下一章 "全栈2019"Java第四十五章:super关键字 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组". 全栈工

“全栈2019”Java第五十四章:多态详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第五十四章:多态详解 下一章 "全栈2019"Java第五十五章:方法的静态绑定与动态绑定 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组"