Java基础反射-调用类
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