java中的反射应用

    技术2022-05-20  44

     

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


    最新回复(0)