现在的位置: 首页 > 综合 > 正文

java中的反射应用

2013年11月09日 ⁄ 综合 ⁄ 共 2348字 ⁄ 字号 评论关闭

 

java中的反射应用s

 

反射是已知.class文件,反射出.java文件。增强了程序的可移植性。

反射用到的类有:(1Class类,Class类是源头;(2Field类,提供类和接口的所有属性;(3Constructor类,是提供所有类和接口的所有构造方法;(4Method类,是提供类和接口的所有方法。

下面举例,已知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("=================");

抱歉!评论已关闭.