• java(通过反射操作对象)


    通过反射创建对象:

    1、方式一:调用类中的public修饰的无参构造器

    2、方式二:调用类中的指定构造器

    3、Class类相关方法

            newInstance:调用类中的无参构造器,获取对应类的对象

            getConstructor( Class...clazz ):根据参数列表,获取对应的构造器对象

            getDecalaredConstructor( Class...clazz):根据参数列表,获取对应的构造器对象

    4、Constructor类相关方法

            setAccessible:暴破

            newInstance(Object...obj):调用构造器

    1. public class ReflectCreateInstance {
    2. public static void main(String[] args) throws Exception{
    3. //先获取到User类的Class对象
    4. Class userClass = Class.forName("reflection_.User");
    5. //通过public的无参构造器创建实例
    6. Object o = userClass.newInstance();
    7. System.out.println(o);
    8. //通过public的有参构造器创建实例
    9. Object jack = userClass.getConstructor(String.class).newInstance("jack");
    10. System.out.println(jack);
    11. //通过非public的有参构造器创建实例
    12. //得到private的构造器对象
    13. Constructor declaredConstructor = userClass.getDeclaredConstructor(String.class, int.class);
    14. declaredConstructor.setAccessible(true);//使用反射可以访问private构造器
    15. Object milan = declaredConstructor.newInstance("milan", 20);
    16. System.out.println(milan);
    17. }
    18. }
    19. class User{
    20. private String name;
    21. private int age;
    22. public User(){}
    23. public User(String name) {
    24. this.name = name;
    25. }
    26. private User(String name, int age){
    27. this.age=age;
    28. this.name=name;
    29. }
    30. @Override
    31. public String toString() {
    32. return "User{" +
    33. "name='" + name + '\'' +
    34. ", age=" + age +
    35. '}';
    36. }
    37. }

    通过反射访问类中成员:

    1.根据属性名获取Field对象

            Field field = class对象.getDeclaredField(属性名)

    2.暴破:f.setAccessible(true)

    3.访问

            f.set(o,值)

            syso(f.get(o))

    4.如果是静态属性,则set和get中的参数o,可以写成null

    1. public class ReflectAccessProperty {
    2. public static void main(String[] args) throws Exception{
    3. Class studentClass = Class.forName("reflection_.Student");
    4. Object o = studentClass.newInstance();
    5. Field age = studentClass.getDeclaredField("age");
    6. age.set(o,20);//通过反射设置属性的值
    7. System.out.println(o);
    8. System.out.println(age.get(o));
    9. //操作静态属性
    10. Field name = studentClass.getDeclaredField("name");
    11. name.setAccessible(true);
    12. name.set(o,"jack");
    13. System.out.println(o);
    14. System.out.println(name.get(null));
    15. }
    16. }
    17. class Student{
    18. private static String name;
    19. public int age;
    20. public Student(){}
    21. @Override
    22. public String toString() {
    23. return "Student{" +
    24. "age=" + age +
    25. '}';
    26. }
    27. }

    通过反射访问方法:

    1.根据方法名和参数列表获取Method方法对象:

            Method m = clazz.getDeclaredMethod(方法名,XX.class);

    2.获取对象:Object o = claszz.newInstance();

    3.暴破:m.setAccessible(true)

    4.访问:Object returnValue = m.invoke(o,实参列表)

    5.注意:如果是静态方法,则invoke的参数o,可以写成null

    1. public class ReflectMethod {
    2. public static void main(String[] args) throws Exception{
    3. Class bossClass = Class.forName("reflection_.Boss");
    4. Object o = bossClass.newInstance();
    5. Method hi = bossClass.getMethod("hi", String.class);
    6. hi.invoke(o,"hello");
    7. //操作静态方法
    8. Method say = bossClass.getDeclaredMethod("say", int.class, String.class, char.class);
    9. say.setAccessible(true);
    10. System.out.println(say.invoke(o,20,"jack",'c'));
    11. }
    12. }
    13. class Boss{
    14. public int age;
    15. private static String name;
    16. public Boss() {}
    17. private static String say(int n,String s,char c){
    18. return n+" "+s+" "+c;
    19. }
    20. public void hi(String s){
    21. System.out.println(s);
    22. }
    23. }

  • 相关阅读:
    从另一个角度谈谈Redis的常用数据结构
    【周赛+双周赛20220904】T4
    【AI使用场景】50个在工作流中的运用场景示例
    web概述14
    Spring框架-IOC
    [Go WebSocket] 多房间的聊天室(二)代码实现
    C#串口通信从入门到精通(25)——整数/小数(浮点数)和字节数组互相转换
    【LINGO】lingo 软件简介
    力扣(LeetCode)算法_C++——最大连续 1 的个数 III
    2021-01-01 - Review代码过程感悟
  • 原文地址:https://blog.csdn.net/weixin_63954483/article/details/126182508