反射

作者: YaphetS081 | 来源:发表于2018-01-13 15:06 被阅读0次

    获取反射类的三种方法:

    1.  Class.forName("类所在的包和类名");

    Class class1 = Class.forName("com.qfedu.a_reflect.Person");

    2:类名.class

    Class class2 = Person.class;

    3.:对象.getClass();

    Class class3 = new Person(1,"jugg").getClass();

    通过反射获取构造方法

    1.获取所有的public构造方法

    Constructor[] constructors = cls.getConstructors();

    2.获取包括私有化的所有构造方法

    Constructor[] allConstructors = cls.getDeclaredConstructors();

    3.通过参数,获取指定的构造方法

    Constructor aConstructor = cls.getConstructor(int.class, String.class);

    4.通过参数,获取指定的构造方法(包括私有的)

    Constructor privateConstructor = cls.getDeclaredConstructor(null);

    5.反射后,通过构造方法,创建对象。如果是私有化构造方法,要给予操作权限。

    privateConstructor.setAccessible(true);

    Person p2 = (Person) privateConstructor.newInstance(null);

    p2.setId(2);

    p2.setName("刘德华");

    System.out.println(p2);

    通过反射,获取方法

    Class cls = Class.forName("com.qfedu.a_reflect.Person");

    Person p = (Person) cls.getConstructor(int.class, String.class).

    newInstance(1, "狗蛋");

    1.获取所有非私有化的方法,包括从父类中继承的

    Method[] allPublicMethods = cls.getMethods();

    2.获取私有化在内的所有方法,过滤掉继承的方法

    Method[] allMethods = cls.getDeclaredMethods();

    3.获取指定的方法(非私有化)

    Method aPublicMethod = cls.getMethod("sleep", int.class);

    获取后,方法的使用:

    aPublicMethod.invoke(p, 15);

    4.获取指定的方法(包括私有化,使用的时候要授权)

    Method aPrivateMethod = cls.getDeclaredMethod("testPrivate", null);

    aPrivateMethod.setAccessible(true);

    aPrivateMethod.invoke(p, null);

    5.获取一个静态方法

    Method aPublicStaticMethod = cls.getMethod("eat", null);

    aPublicStaticMethod.invoke(null, null);

    反射,获取字段

    //加载字节码文件,获取Class类对象

    Class cls = Class.forName("com.qfedu.a_reflect.Person");

    1.获取所有用public修饰的成员变量

    Field[] allPublicFields = cls.getFields();

    2.暴力反射,获取私有化在内的成员变量

    Field[] allFields = cls.getDeclaredFields();

    3.获取指定的字段(非私有化)

    Field aPublicField = cls.getField("test");

    //通过set方法,对对象进行赋值

    //set(Oject obj, Object value);

    //第一个参数: 要操作的是哪一个对象里面的成员变量

    //第二个参数: 需要设置的值

    Person p = (Person) cls.getConstructor(int.class, String.class).

    newInstance(1, "狗蛋");

    aPublicField.set(p, 20);

    System.out.println(p.test);

    4.获取静态的字段

    Field aStaticField = cls.getField("testStatic");

    int num = aStaticField.getInt(cls);

    System.out.println("获取int的静态字段值,转化为int的令一个原始类型的值" + num);

    System.out.println(aStaticField);

    aStaticField.set(null, 20);

    System.out.println(Person.testStatic);

    5.获取私有化的指定字段,使用时要授权

    Field aPrivateField = cls.getDeclaredField("id");

    System.out.println(aPrivateField);

    aPrivateField.setAccessible(true);

    aPrivateField.set(p, 10);

    System.out.println(p.getId());

    相关文章

      网友评论

          本文标题:反射

          本文链接:https://www.haomeiwen.com/subject/enaqoxtx.html