JAVA知识点总结-17类加载器,反射

来源:互联网 发布:什么叫人工智能技术 编辑:程序博客网 时间:2024/06/05 16:15

一:反射:通过字节码文件对象去使用成员

  在有getConstructors()     getDeclaredConstructors() 
      有D的时候是可以访问私有,有s是所有

用方法对象调用invoke方法,确定由哪个对象去执行方法本身

m.invoke(obj, 10);

    

 

  1. 获取字节码文件对象的三种方式:

      A.Object类的getClass()方法

Person p1 = new Person();

Class c1 = p1.getClass();

    B.数据类型的静态class属性 

Class c3 = Person.class;

  C.Class类的静态方法forName()

Class c4 = Class.forName("westo.org.java.Person"); 这里的路径是带包的类名


    2. Class c = Class.forName("westo.org.java.Person");

Constructor[] cons = c.getConstructors();     获取这个类中的所有构造方法

Constructor[] cons2 = c.getDeclaredConstructors();    获取这个类中多有的构造方法,包括私有

        Object obj = con.newInstance();  用获得的无参构造创建对象


        Constructor con2 = c.getDeclaredConstructor(String.class, int.class, String.class);

        con2.setAccessible(true);     取消访问修饰符的限制

                      如果要取得的Field是private的,那么就要调用setAccessible(true),否则会报错
Object obj2 = con2.newInstance("陈奕迅", 45, "香港");


   

  3.反射的使用步骤

   Class:

   成员变量 Field

   构造方法 Constructor

   成员方法 Method


   class字节码文件对象 -- 去得到对应的成员对象 -- 通过该成员的对象调用方法使用


   A.Field

        1.Class c = Class.forName("westo.org.java.Person");  创建字节码文件对象

   2.Constructor con = c.getConstructor();     获取构造方法
3.Object obj = con.newInstance();      通过构造方法创建对象

4.Field[] fields = c.getFields();      获取公共成员变量

5.Field[] fields2 = c.getDeclaredFields();   获取公共成员变量,包括私有

                6.Field f = c.getDeclaredField("name");   传入变量名称返回指定的成员变量对象

      f.setAccessible(true);     取消访问修饰符的限制
     f.set(obj, "谢娜");            传参

   System.out.println(obj);   输出


    B.Method

1.Class c = Class.forName("westo.org.java.Person");  创建字节码文件对象

   2.Constructor con = c.getConstructor();     获取构造方法
3.Object obj = con.newInstance();      通过构造方法创建对象

4.Method[] methods = c.getMethods(); 获取所有公共成员方法,包括父类的公共成员方法


                 public Method getDeclaredMethod(String name,Class<?>...parameterTypes)
 参数一:方法名 参数二:方法参数类型.class 获取指定的方法,包括私有

5.Method m = c.getMethod("method"); 获取这个方法 

                   m.invoke(obj);    使用obj这个对象调用m表示的方法


 6. Method m4 = c.getDeclaredMethod("show",String.class,String.class);
        m4.setAccessible(true);
        m4.invoke(obj, "张杰","谢娜");

   

   


我给你ArrayList<Integer>的一个对象,我想在这个集合中添加一个字符串数据,如何实现呢?

           //1.创建ArrayList类对应的字节码文件对象
ArrayList<Integer> arr = new ArrayList();
   Class c = arr.getClass();
   
   //2.通过字节码文件对象获取到add方法对象
   Method addM = c.getDeclaredMethod("add", Object.class);
   
   //3.调用add方法的对象,给集合中添加字符串
   addM.invoke(arr, "java");
   addM.invoke(arr, "world");
   System.out.println(arr);


原创粉丝点击