反射应用(一)

来源:互联网 发布:java编程题全集及答案 编辑:程序博客网 时间:2024/04/28 00:20

 

反射的应用(一)
 
1.     类的加载:是指把类的 .class 文件中的二进制数据说读入到内存中,把它存放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。
2.         如何加载类代码:
3.         public void test() throws ClassNotFoundException {
4.         // 1、加载类
5.         Class cls = Class.forName("cn.csdn.reflect.Student");
6.         System.out.println(cls);
7.         // 2、加载类
8.         Student stu = new Student();
9.         Class cls1 = stu.getClass();
10.     System.out.println(cls1);
11.     // 3、加载类
12.     Class cls2 = Student.class;
13.     System.out.println(Student.class);
14.     }
15.     如何将加载类并利用反射解析:
16.     解析:类中的无惨的构造器 public Student();
17.     @Test
18.     public void test() throws Exception{
19.     //1、加载类
20.     Class cls=Class.forName("com.csdn.java01.Student");
21.     //2、通过带无惨的构造器解析
22.     Constructor constructor=cls.getConstructor(null);
23.     //3、创建类实例-->类的构造函数没有参数所以是空
24.     Student student=(Student) constructor.newInstance(null);
25.     student.study();
26.     }
27.     解析:类中的有惨的构造器public Student(String name,int age);
28.     @Test
29.     public void test2()throws Exception{
30.     //1、加载类
31.     Class cls = Class.forName("cn.csdn.reflect.Student");
32.     //2、通过带有参数的构造器解析
33.     Constructor constructor = cls.getConstructor(String.class,int.class);
34.     //3、创建类实例-->类的构造函数有参数所以需要值
35.     Student entity = (Student)constructor.newInstance("redarmy",90);
36.     //4、调用方法
37.     entity.study();
38.     System.out.println(entity.getName());
39.     }
40.     解析:类中的有惨的构造器public Student(String str[]);
41.     @Test
42.     public void test4()throws Exception{
43.     //1、加载类
44.     Class cls = Class.forName("cn.csdn.reflect.Student");
45.     //2、根据构造器参数类型获取相应的构造器对象
46.     Constructor csr = cls.getConstructor(String[].class);
47.     String str[]={"111","123"};
48.     //3、创建实体对象
49.     Student entity = (Student)csr.newInstance((Object)str);
50.     //4、调用方法
51.     entity.study();
52.     }
53.     反射在类中构造函数传数组参数是应把它专为Object类型由于Student(String strs[])构造器只有一个String数组的参数所以这是编译器会把字符串数组当作一个可变长度参数传 给对象strs,而我们取得方法只有一个参数,所以就会出现wrong number of arguments的异常,我们只要把字符串数组强制转换为一 个Object对象就可以解决这个异常了,
54.     执行代码:
55.     //解析:public cn.csdn.reflect.Student(java.lang.String[])
56.     @Test
57.     public void test4()throws Exception{
58.     //1、加载类
59.     Class cls = Class.forName("cn.csdn.reflect.Student");
60.     //2、根据构造器参数类型获取相应的构造器对象
61.     Constructor csr = cls.getConstructor(String[].class);
62.     //3、创建实体对象
63.     Student entity = (Student)csr.newInstance(new String[]{});
64.     //4、调用方法
65.     entity.study();
66.     }
67.     解析:类中的有惨的构造器public Student(String str[],double a);
68.     @Test
69.     public void test4()throws Exception{
70.     //1、加载类
71.     Class cls = Class.forName("cn.csdn.reflect.Student");
72.     //2、根据构造器参数类型获取相应的构造器对象
73.     Constructor csr = cls.getConstructor(String[].class,double.class);
74.     String str[]={"111","123"};
75.     //3、创建实体对象
76.     Student entity = (Student)csr.newInstance(new String[]{“12”,”13”},1.0);
77.     //4、调用方法
78.     entity.study();
79.     }
80.     如何知道类中所有的构造器?
81.     代码如下:
82.     public void test3()throws Exception{
83.     //1、加载类
84.     Class cls = Class.forName("cn.csdn.reflect.Student");
85.     //2、获取加载类中的所有的构造器
86.     Constructor csr[] = cls.getConstructors();
87.     //3、遍历构造器csr
88.     for(Constructor c:csr){
89.     //打印出构造器参数的类型及构造器名称
90.     System.out.println(c.toGenericString());
91.     }
92.     }
 
原创粉丝点击