Java基础反射-调用类

  Student类

  1 package com.test.wang;
  2 import java.lang.reflect.Constructor;
  3 import java.lang.reflect.Field;
  4 import java.lang.reflect.Method;
  5 import java.util.ArrayList;
  6 
  7 import com.test.wang.student.Student;
  8 public class fanshe {
  9     public static void main(String[] args)throws Exception {
 10         
 11         //1.加载class对象
 12         Class stuClass= Class.forName("com.test.wang.student.Student");
 13         
 14         //2.获取class中的方法 
 15             //2.1.获取成员方法
 16                 //2.1.1.获取Student类中的 testStudent共有方法 一个参数 返回类型 无
 17                 Method m = stuClass.getMethod("testStudent", String.class);
 18                 //2.1.2.获取Student类中的 intStudent共有方法 一个参数 返回类型 String
 19                 Method intm = stuClass.getMethod("intStudent", String.class);
 20                 //2.1.3.获取Student类中的 liangStudent共有方法 二个参数 返回类型 String
 21                 Method liangm = stuClass.getDeclaredMethod("liangStudent", String.class,int.class);
 22                 //2.1.4.获取Student类中的 liangStudent私有方法 二个参数 返回类型 String
 23                 Method privatem = stuClass.getDeclaredMethod("privateStudent", String.class,int.class);
 24             //2.2.获取构造方法
 25                 //2.2.1.获取共有的、无参数的构造方法
 26                 Constructor con = stuClass.getConstructor(null);
 27                 //2.2.2.获取构造方法并调用
 28                 Constructor dcon = stuClass.getDeclaredConstructor(String.class);
 29             //2.3.获取字段信息
 30                 //2.3.1.获取共有字段并调用
 31                 Field publicFiled = stuClass.getField("name");
 32                 //2.3.2.获取字段并调用
 33                 Field privateFiled = stuClass.getDeclaredField("phoneNum");
 34             //2.4.反射main方法
 35                 //2.4.1.main方法的反射
 36                 Method main = stuClass.getMethod("main", String[].class);
 37                         
 38         //3.获取一个对象********等同于****Student obj = new Student();
 39         System.out.println("\n******获取一个对象******");
 40         Object obj = stuClass.getConstructor().newInstance();
 41         
 42         //4.调用方法        有返回类型 在这里实际都是返回Object
 43         System.out.println("\n******调用共有、无参数构造方法******");
 44         m.invoke(obj,"wang");
 45         
 46         String num =intm.invoke(obj,"wang").toString();
 47         String stu = liangm.invoke(obj, "wang",23).toString();
 48         
 49         privatem.setAccessible(true);//暴力访问(忽略掉访问修饰符)
 50         String privateStu = privatem.invoke(obj, "wang",23).toString();
 51         
 52         System.out.println("\n******无参数构造方法的调用******");
 53         con.newInstance();
 54         
 55         System.out.println("\n******默认的构造方法有参数******");
 56         dcon.setAccessible(true);
 57         dcon.newInstance("wang");
 58         
 59         publicFiled.set(obj, "天宇");
 60         
 61         privateFiled.setAccessible(true);
 62         privateFiled.set(obj, "155*******5");
 63         
 64         Student wangstu = (Student)obj;
 65 
 66         System.out.println("\n******main方法******");
 67         main.invoke(null, (Object)new String[]{"a","b","c"});
 68         
 69         //返回结果
 70         System.out.println("\n******成员方法一个参数******");
 71         System.out.println(num);
 72         System.out.println("\n******成员方法二个参数******");
 73         System.out.println(stu);
 74         System.out.println("\n******私有成员方法二个参数******");
 75         System.out.println(privateStu);
 76         System.out.println("\n******获取共有字段信息******");
 77         System.out.println("publicFiled:"+wangstu.name);
 78         System.out.println("\n******获取字段信息、私有的字段信息需要用方法写出来******");
 79         System.out.println("privateFiled:"+wangstu.toString());
 80         
 81         /*
 82          * 通过反射越过泛型检查
 83          */
 84         ArrayList<String> strList = new ArrayList<String>();
 85         strList.add("aaa");
 86         strList.add("bbb");
 87         //strList.add(100);
 88         //获取ArrayList的class对象,反向调用add()方法,添加数据
 89         Class ListClass = strList.getClass();
 90         //获取add()方法
 91         Method ListClassMethod = ListClass.getMethod("add", Object.class);
 92         //调用add()方法
 93         ListClassMethod.invoke(strList, 100);
 94         //遍历集合
 95         for(Object o : strList){
 96             System.out.println(o);
 97         }
 98         
 99     }
100 }

 

  测试类

 1 package com.test.wang.student;
 2 
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5 
 6 public class Student {
 7     /*
 8      * 构造方法
 9      */
10     Student(String stu){
11         System.out.println("默认的构造方法stu="+stu);
12     }
13     /*
14      * 无参数构造方法
15      */
16     public Student(){
17         System.out.println("调用共有、无参数构造方法执行了。。。");
18     }
19 
20     public void testStudent(String name){
21         System.out.println("调用共有、一个参数方法执行了。。。姓名:"+name);
22     }
23     
24     public String intStudent(String name){
25         int num = name.length();
26         return "姓名:"+name+"   名字长度:"+num;
27     }
28     
29     public String liangStudent(String name,int age){
30         return "姓名:"+name+"   年龄:"+age;
31     }
32     
33     private String privateStudent(String name,int age){
34         return "姓名:"+name+"   年龄:"+age;
35     }
36     
37     public String name;
38     
39     private String phoneNum;
40 
41     /**
42      * @return the name
43      */
44     public String getName() {
45         return name;
46     }
47     /**
48      * @return the phoneNum
49      */
50     public String getPhoneNum() {
51         return phoneNum;
52     }
53     @Override
54     public String toString(){
55         return "Student  [name:"+name+",phoneNum:"+phoneNum+"]";
56     }
57     public static void main(String[] args){
58         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
59         System.out.println("main方法执行了。。。");
60         System.out.println("当前时间是:"+df.format(new Date()));
61     }
62 }

 

 控制台输出

******获取一个对象******
调用共有、无参数构造方法执行了。。。

******调用共有、无参数构造方法******
调用共有、一个参数方法执行了。。。姓名:wang

******无参数构造方法的调用******
调用共有、无参数构造方法执行了。。。

******默认的构造方法有参数******
默认的构造方法stu=wang

******main方法******
main方法执行了。。。
当前时间是:2018-07-31 15:12:18

******成员方法一个参数******
姓名:wang 名字长度:4

******成员方法二个参数******
姓名:wang 年龄:23

******私有成员方法二个参数******
姓名:wang 年龄:23

******获取共有字段信息******
publicFiled:天宇

******获取字段信息、私有的字段信息需要用方法写出来******
privateFiled:Student [name:天宇,phoneNum:155*******5]
aaa
bbb
100

posted @ 2018-07-30 15:00  寂寞的流星雨  阅读(316)  评论(0编辑  收藏  举报