关于JAVA反射应用容易出现的一个隐性错误:

    技术2022-05-20  38

    关于JAVA反射应用容易出现的一个隐性错误:

        举例来说明:

         //

         //加载目录类CLASS

        Class targetCls = Class.forName("cn.cactustest.User");

         //初始化Class

         Object target= targetCls.newInstance();

         //

      Class : User

    package cn.cactustest;

     

    public class User {

        private String name;

        private int age;

          

        public User(String name,int age){

           this.name=name;

           this.age=age;

        }

     

        public String getName() {

           return name;

        }

     

        public void setName(String name) {

           this.name = name;

        }

     

        public int getAge() {

           return age;

        }

     

        public void setAge(int age) {

           this.age = age;

        }

     

        public String queryUser(String name) {

           return name;

     

        }

        @Override

        public String toString(){

           StringBuilder sb=new StringBuilder();

           sb.append("/tName: ").append(name);

           sb.append("/tAge : ").append(age);

           return sb.toString();

        }

    }

     

    测试代码如下:

    package cn.cactustest;

     

    public class FlectNewInstance {

     

        /********************

         *

         * <p>演示一个关于映射应用出现的问题</p>

         * @param args

         */

        public static void main(String[] args) {

           try {

               //标记Start

               System.out.println(">>>>>>>>>>>>>> 测试主函数启动   <<<<<<<<<<<<<<<<<<<");

               // 加载目录类CLASS

               Class targetCls = Class.forName("cn.cactustest.User");

     

               // 初始化Class

               Object targetObject = targetCls.newInstance();

    System.out.println(">>>>>>>>>>>>>>>>>>打印出对象:/t"+targetObject);

              

               //标记End

    System.out.println(">>>>>>>>>>>>>> 测试主函数结束  <<<<<<<<<<<<<<<<<<<");

              

               // 抓获异常

           } catch (ClassNotFoundException e) {

               e.printStackTrace();

           } catch (InstantiationException e) {

               e.printStackTrace();

           } catch (IllegalAccessException e) {

               e.printStackTrace();

           }

        }

    }

     

    运行结果如下:

    >>>>>>>>>>>>>> 测试主函数启动   <<<<<<<<<<<<<<<<<<<

    java.lang.InstantiationException: cn.cactustest.User

        at java.lang.Class.newInstance0(Unknown Source)

        at java.lang.Class.newInstance(Unknown Source)

        at cn.cactustest.FlectNewInstance.main(FlectNewInstance.java:18)

     

    出现了一个异常:InstantiationException意思是不能实例化异常

    为什么不能实例化呢?

    首先:分析一般类的初始的一个过程:

    (1)初始化静态变量(从父类-à子类)

    (2)静态代码块执行

    (3)初始化构造函数(从父类-à子类)

    (4)非静态代码块

    粗略的从这几个方面可以找到答案:

       cn.cactustest.User不能实例化,肯定是构造逊数的问题

    来看一下是否有构造函数

     public User(String name,int age){

           this.name=name;

           this.age=age;

        }

    有一个构造函数(两个参数)

    这就出现了一个问题:如果有一个构造函数,那么隐性的构造函数就会失效

    也就是说

    Public User(){

    }

    这个就不能被系统自动调用

    而反射实例的机制就是动态生成对象,而生成对象要调用这个无参的构造函数,才能实现。

    那么我们在User对象中增加这个无参构造函数

    public User(){

    }

     

    运行结果如下:

    >>>>>>>>>>>>>> 测试主函数启动   <<<<<<<<<<<<<<<<<<<

    >>>>>>>>>>>>>>>>>>打印出初始对象:     Name: null Age : 0

    >>>>>>>>>>>>>> 测试主函数结束  <<<<<<<<<<<<<<<<<<<

     

    类实例成功


    最新回复(0)