• Java反射02 : Class对象获取的三种方式和通过反射实例化对象的两种方式


    1.Class对象获取的三种方式

    本文转载自:https://blog.csdn.net/hanchao5272/article/details/79361463

    上一章节已经说过,一般情况下,Java反射操作都需要首先获取Class对象。获取Class对象的方式有三种。

    1. 公有属性class
    2. 方法getClass()
    3. Class.forName()

    下面是示例代码:

     1 /**
     2  * <p>Title: Java获取Class对象的三种方式</p>
     3  */
     4 public class ReflectClassDemo {
     5     /** log4j */
     6     private static final Logger LOGGER = Logger.getLogger(ReflectClassDemo.class);
     7     /**
     8     * <p>获取Class对象的三种方式</p>
     9     */
    10     public static void main(String[] args) throws ClassNotFoundException {
    11         LOGGER.info("获取Class对象方式01:类的public属性class");
    12         Class clazz1 = User.class;
    13         LOGGER.info(clazz1);
    14 
    15         System.out.println();
    16         LOGGER.info("获取Class对象方式02:类的public方法getClass()");
    17         User user = new User();
    18         Class clazz2 = user.getClass();
    19         LOGGER.info(clazz2);
    20 
    21         System.out.println();
    22         LOGGER.info("获取Class对象方法03:Class.forName(需要抛出异常)");
    23         Class clazz3 = Class.forName("pers.hanchao.reflect.common.User");
    24         LOGGER.info(clazz3);
    25     }
    26 }

    运行结果:

    1 ReflectClassDemo:18 - 获取Class对象方式01:类的public属性class
    2 ReflectClassDemo:20 - class pers.hanchao.reflect.common.User
    3 
    4 ReflectClassDemo:23 - 获取Class对象方式02:类的public方法getClass()
    5 ReflectClassDemo:26 - class pers.hanchao.reflect.common.User
    6 
    7 ReflectClassDemo:29 - 获取Class对象方法03:Class.forName(需要抛出异常)
    8 ReflectClassDemo:31 - class pers.hanchao.reflect.common.User

    2.通过反射实例化对象的两种方式

    除了通过new实例化对象,我们还可以通过反射实例化对象对象,有两种方式:

    1. Class.newInstance()
    2. Constructor.newInstance()

    下面是示例代码:

     1 /**
     2  * 通过反射创建对象的两种方式
     3  */
     4 public class CreateObjectDemo {
     5     private final static Logger LOGGER = Logger.getLogger(CreateObjectDemo.class);
     6 
     7     /**
     8      * <p>Title: 通过反射创建对象的两种方式</p>
     9      */
    10     public static void main(String[] args) throws Exception {
    11         //通过new实例化对象
    12         User user = new User();
    13         LOGGER.info("通过new实例化对象:" + user.toString());
    14 
    15         //通过反射实例化对象
    16         Class userClass = User.class;
    17         //通过反射实例化对象01-Class.newInstance()(需要强制类型转换[无参构造])
    18         User user1 = (User) userClass.newInstance();
    19         LOGGER.info("通过反射实例化对象01-Class.newInstance()(需要强制类型转换[无参构造]):" + user1.toString());
    20         //通过反射实例化对象02-Constructor.newInstance()(需要强制类型转换[可带参数])
    21         Constructor constructor = userClass.getDeclaredConstructor();
    22         User user2 = (User) constructor.newInstance();
    23         LOGGER.info("通过反射实例化对象02-Constructor.newInstance()(需要强制类型转换[无参构造]):" + user2.toString());
    24         Constructor constructor1 = userClass.getDeclaredConstructor(String.class,String.class);
    25         User user3 = (User) constructor1.newInstance("李四","000000");
    26         LOGGER.info("通过反射实例化对象02-Constructor.newInstance()(需要强制类型转换[有参构造]):" + user3.toString());
    27     }
    28 }

    运行结果:

    1 INFO  CreateObjectDemo:22 - 通过new实例化对象:User{username='张三', password='123456'}
    2 INFO  CreateObjectDemo:27 - 通过反射实例化对象01-Class.newInstance()(需要强制类型转换[无参构造]):User{username='张三', password='123456'}
    3 INFO  CreateObjectDemo:31 - 通过反射实例化对象02-Constructor.newInstance()(需要强制类型转换[无参构造]):User{username='张三', password='123456'}
    4 INFO  CreateObjectDemo:34 - 通过反射实例化对象02-Constructor.newInstance()(需要强制类型转换[有参构造]):User{username='李四', password='000000'}

    总结:

    1. 通过Class.newInstance()进行对象实例化:实际调用的是无参数的构造函数进行实例化。
    2. 通过Constructor.newInstance()进行对象实例化:可以选择调用哪个构造函数进行实例化。
  • 相关阅读:
    解决 Ant Sword-HTTPS 证书失效(cert_has_expired)连不上问题
    通达OA 11.2后台getshell漏洞复现
    通达OA 任意文件上传+文件包含导致RCE
    xxl-job <=2.0.2 反序列化漏洞
    代理模式学习
    javassist 使用笔记
    CommonsCollections3 反序列化利用链分析
    CommonsCollections2 反序列化利用链分析
    CommonsCollections1 反序列化利用链分析
    httpd通过ajp协议反向代理tomcat
  • 原文地址:https://www.cnblogs.com/Reverse-xiaoyu/p/11837656.html
Copyright © 2020-2023  润新知