java中的反射应用s
反射是已知.class文件,反射出.java文件。增强了程序的可移植性。
反射用到的类有:(1)Class类,Class类是源头;(2)Field类,提供类和接口的所有属性;(3)Constructor类,是提供所有类和接口的所有构造方法;(4)Method类,是提供类和接口的所有方法。
下面举例,已知cn.csdn.reflect.Student.class创建Student类的对象:
//第一步:加载类
//加载类的时候,有三种方法,下面的第一种方法常用
// <1>方法一
Class cls = Class.forName("cn.csdn.reflect.Student");
// <2>方法二
Student stu = new Student();
Class cls1 = stu.getClass();
// <3>方法三
Class cls2 = Student.class;
//第二步:解析类
//<1>、获取加载类中的所有的构造器
Constructor csr[] = cls.getConstructors();
//<2>、遍历构造器csr
for(Constructor c:csr){
//打印出构造器参数的类型及构造器名称
System.out.println(c.toGenericString());
}
/*
*第三步:由上的输出可以知道,该类中有什么样的构造的方法
*/
//如果Student中有共有的无参构造,创建Student对象如下:
Constructor constructor = cls.getConstructor(null);
Student entity = (Student) constructor.newInstance(null);
//如果Student的构造方法是:public Student(String name,int age)
Constructor onstructor=cls.getConstructor(String.class,int.class);
Student entity = (Student)constructor.newInstance("郭倩芳",18);
//如果Student的构造方法是:public Student(String[])
Constructor csr = cls.getConstructor(String[].class);
String str[]={"111","123"};
Student entity = (Student)csr.newInstance((Object)str);
//如果Student的构造方法是:private Student(List list)
Constructor csr = cls.getDeclaredConstructor(List.class);
//因为是私有的构造方法,所以要用这个setAccessible(true)方法
csr.setAccessible(true);//强制生成对象
Student entity = (Student)csr.newInstance(new ArrayList());
//获得Student的所有的方法
System.out.println("=======获得Student的所有方法========"); Method methods[]=cls.getMethods();for(Method m : methods){ System.out.println(m.getName()); System.out.println(m.toGenericString());}
System.out.println("=========调用无参的方法======"); Method method = c.getMethod("study", null); method.invoke(stu, null); System.out.println("========调用带参的方法======="); Method me=c.getMethod("getSum", int.class,int.class); Object o=me.invoke(stu, 20,2); System.out.println(o); System.out.println("=======解析主方法======="); Method memain=c.getMethod("main", String[].class); String arr[]={"a","n"}; memain.invoke(stu, (Object)arr); Field field[]= c.getDeclaredFields(); System.out.println(field.length); for(Field f:field){ System.out.println(f.getName()); } System.out.println("=====获得私有的属性========"); Field f=c.getDeclaredField("name"); f.setAccessible(true); stu.setName("郭倩芳"); Object obj = f.get(stu); System.out.println((String)obj); System.out.println("=================");