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("=================");