精华内容
下载资源
问答
  • java反射class的三种方式,反射创建对象的两种方式

    万次阅读 多人点赞 2018-08-15 11:46:21
    Java API 中,提供了获取 Class 类对象三种方法: 第一种,使用 Class.forName 静态方法。 前提:已明确类的全路径名。 第二种,使用 .class 方法。 说明:仅适合在编译前就已经明确要操作的 Class 第三种...

    反射中,欲获取一个类或者调用某个类的方法,首先要获取到该类的 Class 对象。

    1、获取Class对象

    在 Java API 中,提供了获取 Class 类对象的三种方法:

    第一种,使用 Class.forName 静态方法。

    前提:已明确类的全路径名。

    第二种,使用 .class 方法。

    说明:仅适合在编译前就已经明确要操作的 Class

    第三种,使用类对象的 getClass() 方法。

    适合有对象示例的情况下

    代码示例:

    package com.reflection;
    
    /**
     * Created by Liuxd on 2018-08-15.
     */
    public class User {
        private String name;
        private Integer age;
    
        public User() {
        }
    
        public User(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
    package com.reflection;
    
    /**
     * Created by Liuxd on 2018-08-15.
     */
    public class TestReflection {
    
        public static void main(String[] args) {
    //      第一、通过Class.forName方式
            Class clazz1 = null;
            try {
                clazz1 = Class.forName("com.reflection.User");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
    
    //      第二、通过对象实例方法获取对象
            Class clazz2 = User.class;
    
    //      第三、通过Object类的getClass方法
            User user = new User();
            Class clazz3 = user.getClass();
    
            System.out.println(clazz1);
            System.out.println(clazz2);
            System.out.println(clazz3);
        }
    }

    2、获取对象实例

    共两种方法:

    2.1、直接用字节码文件获取对应实例

    1

    // 调用无参构造器 ,若是没有,则会报异常

    Object o = clazz.newInstance();  

    2.2、有带参数的构造函数的类,先获取到其构造对象,再通过该构造方法类获取实例:

    1

    2

    3

    / /获取构造函数类的对象

    Constroctor constroctor = clazz.getConstructor(String.class,Integer.class); /

    // 使用构造器对象的newInstance方法初始化对象

    Object obj = constroctor.newInstance("龙哥", 29); 

    代码示例:

    package com.reflection;
    
    import java.lang.reflect.Constructor;
    
    /**
     * Created by Liuxd on 2018-08-15.
     */
    public class TestReflection {
    
        public static void main(String[] args) {
    //      第一、通过Class.forName方式
            Class clazz1 = null;
            try {
                clazz1 = Class.forName("com.reflection.User");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
    
    //      第二、通过对象实例方法获取对象
            Class clazz2 = User.class;
    
    //      第三、通过Object类的getClass方法
            User user = new User();
            Class clazz3 = user.getClass();
    
            System.out.println(clazz1);
            System.out.println(clazz2);
            System.out.println(clazz3);
    
            User user1 = null;
            try {
                 user1 =(User) clazz1.newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            user1.setName("终结者");
            user1.setAge(1500);
            System.out.println("user1:"+user1.toString());
    
    
            User user2 = null;
            try {
                // 获取构造函数
                Constructor constroctor = clazz2.getConstructor(String.class,Integer.class);
                // 通过构造器对象的newInstance方法进行对象的初始化
                user2 = (User) constroctor.newInstance("龙哥",29);
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("user2:"+user2.toString());
    
        }
    }
    

     

    展开全文
  • 主要介绍了Java使用反射创建对象,结合实例形式分析了java使用反射创建对象的具体实现方法及相关操作技巧,需要的朋友可以参考下
  • Java反射创建对象效率高还是通过new创建对象的效率高? 通过new创建对象的效率比较高。 通过反射时,先找查找类资源,使用类加载器创建,过程比较繁琐,所以效率较低。

    Java反射创建对象效率高还是通过new创建对象的效率高?

    通过new创建对象的效率比较高。
    通过反射时,先找查找类资源,使用类加载器创建,过程比较繁琐,所以效率较低。

    展开全文
  • 主要介绍了java通过反射创建对象并调用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • java通过反射创建对象的两方式

    千次阅读 2019-03-07 15:44:05
    java中,通过反射创建对象有两种方式 使用Class对象的newInstance()方法来创建对象; 具体步骤是 1、获取类的Class对象(有三种方式可以获取,可以自行百度一下) 2、通过调用所获取到的Class对象的newInstance...

    我个人觉得我自己是个比较粗心的人,所以各位大佬发现有什么不对的地方还请留言告知
    在java中,通过反射创建对象有两种方式

    1. 使用Class对象的newInstance()方法来创建对象;
      具体步骤是:
      1、获取类的Class对象(有三种方式可以获取,可以自行百度一下)
      2、通过调用所获取到的Class对象的newInstance()来获得对象,该方法会返回一个Object类型的对象,所以还需要强转一下;
      举个例子:
      新建一个Hog,里面定义一个方法getName()输出一句话,可以看到运行之后控制台输出了青青草原四个字,
    package Lin;
    
    public class Pig {
        public static void main(String[] args) throws IllegalAccessException, InstantiationException {
            //通过类.class的方式获取一个该类的Class实例
            Class hogClass = Hog.class;
            //通过调用newInstance()方法获取一个Hog的实例, 该方法会返回一个Object类型的对象并且会抛出两个异常,
            Hog hog = (Hog) hogClass.newInstance();
            hog.getName();
        }
    }
    class Hog {
        public void getName() {
            System.out.println("青青草原");
        }
    }
    

    在这里插入图片描述

    把上面的代码再修改一下
    修改后的代码在Hog类构造函数中添加了一句代码,输出一句话,然后运行代码,可以发现构造函数被调用了,说明在使用Class类的newInstance()方法获得一个类的实例时,依然会调用他的(默认)构造函数;

    package Lin;
    
    public class Pig {
        public static void main(String[] args) throws IllegalAccessException, InstantiationException {
            //通过类.class的方式获取一个该类的Class实例
            Class hogClass = Hog.class;
            //通过调用newInstance()方法获取一个Hog的实例, 该方法会返回一个Object类型的对象并且会抛出两个异常,
            Hog hog = (Hog) hogClass.newInstance();
            hog.getName();
        }
    }
    class Hog {
        public Hog() {
            System.out.println("无参构造函数");
        }
        public void getName() {
            System.out.println("青青草原");
        }
    }
    

    在这里插入图片描述

    1. 通过Constructor类的newInstance()方法获取
      具体步骤是
      1、获取一个类的一个Class实例;
      2、调用Class中的getConstructor()方法获得一个Constructor对象,
      3、调用Constructor的newInstance()方法获得一个类的实例;

      再举个例子,把上面的代码稍微改一下:
      Hog类中的代码不变,在主方法中通过getConstructor()方法获得一个Constructor类的实例,然后通过Constructor的newInstance()方法获得一个类的实例;

    getConstructor(Class<?>… parameterTypes)方法中可以传递Class类型的参数(不知到Class…的可以把他理解成参数是Class类型的数组),通过传递的参数来获得Class对象所包含的类的指定的public构造方法(就是找指定的构造方法,因为一个类可以有好多个构造方法,当你的一个构造方法为public Hog(int a) 时, 那就可以传递int.class进去)想知道的就查相关api吧,

    package Lin;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    
    public class Pig {
        public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
            //通过类.class的方式获取一个该类的Class实例
            Class hogClass = Hog.class;
            //调用Class类的getConstructor()获得一个指定的构造器(参数为空则获得默认的构造器)对象   注意 获得的构造器得是被public修饰的
            Constructor constructor = (Constructor) hogClass.getConstructor();
            //调用Constructor的newInstance()方法获取一个Hog实例(注意要强转)
            Hog hog = (Hog) constructor.newInstance();
            hog.getName();
        }
    }
    class Hog {
        public Hog() {
            System.out.println("无参构造函数");
        }
        public void getName() {
            System.out.println("青青草原");
        }
    }
    

    运行截图:
    在这里插入图片描述
    将上面的代码再进行修改一下
    1.在Hog类中定义一个带参的构造函数,形参为String类型
    2.在主方法中调用Class的getConstructor()方法并传递String.class进去(告诉方法我要找到一个参数 是String类型的构造函数)
    3.调用Constructor的newInstance()方法并传递一个String类型的字符串进去(可以理解成就是传递构造函数的参数进去)
    运行之后可以看到带参数的构造函数被调用了;

    package Lin;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    
    public class Pig {
        public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
            //通过类.class的方式获取一个该类的Class实例
            Class hogClass = Hog.class;
            //调用Class类的getConstructor()获得一个参数为String类型的构造器对象
            Constructor constructor = (Constructor) hogClass.getConstructor(String.class);
            //调用Constructor的newInstance()方法获取一个Hog实例(传递一个String类型的参数)
            Hog hog = (Hog) constructor.newInstance("我是Constructor类调用的");
            hog.getName();
        }
    }
    
    class Hog {
        public Hog() {
            System.out.println("无参构造函数");
        }
    
        public Hog(String message) {
            System.out.println(message);
        }
    
        public void getName() {
            System.out.println("青青草原");
        }
    }
    

    在这里插入图片描述
    两种方法的区别
    第一种方法、通过Class的newInstance()方法只能使用默认的构造方法,换句话说就是使用此方法是不能通过带参的构造函数来生成一个类的实例;

    第二种方法、通过Constructor的newInstance()方法可以使用默认的构造方法,也可以使用带参的构造方法来生成一个类的实例

    在只有一个默认的构造函数(或不带参数的构造函数)时,使用第一种方法比较方便,如果要使用类中的其他构造方法那只能使用第二种方法了。

    展开全文
  • java通过反射创建对象的两种方式与区别 1.使用Class对象的newInstance()方法来创建对象: 具体步骤是: 1、获取类的Class对象(有三种方式可以获取,可以自行百度一下) 2、通过调用所获取到的Class对象的newInstance...

    java通过反射创建对象的两种方式与区别

    1.使用Class对象的newInstance()方法来创建对象:

    具体步骤是:
    1、获取类的Class对象(有三种方式可以获取,可以自行百度一下)
    2、通过调用所获取到的Class对象的newInstance()来获得对象,该方法会返回一个Object类型的对象,所以还需要强转一下。
    在这里s 插入图片描述

    2.通过Constructor类的newInstance()方法获取

    具体步骤是
    1、获取一个类的一个Class实例
    2、调用Class中的getConstructor()方法获得一个Constructor对象
    3、调用Constructor的newInstance()方法获得一个类的实例
    在这里插入图片描述

    两种方法的区别

    第一种方法:通过Class的newInstance()方法只能使用默认的构造方法,换句话说就是使用此方法是不能通过带参的构造函数来生成一个类的实例。

    第二种方法:通过Constructor的newInstance()方法可以使用默认的构造方法,也可以使用带参的构造方法来生成一个类的实例。

    注意:在只有一个默认的构造函数(或不带参数的构造函数)时,使用第一种方法比较方便,如果要使用类中的其他构造方法那只能使用第二种方法了。

    展开全文
  • Java通过反射创建对象

    千次阅读 2016-11-13 23:28:35
    通过反射创建对象 创建对象之前,我们必须先知道要为哪个类创建对象。我们需要拿到这个类的全路径名。类似java.lang.String,除此之外我们还需要知道这个类的构造函数,是否有参数,参数的类型各是什么。下面分两...
  • 反射创建对象 当我们反射创建对象,一般采用 Class clazz = Class.forName("java.lang.String"); Object instance = c.newInstance(); 这样创建对象,但这样默认是用无参的构造函数,当我们想通过反射调用...
  • java 中通过反射创建对象
  • java使用反射创建对象

    万次阅读 2016-10-08 17:12:41
    Class对象中包括构造器(Constructor)、属性(Field)、方法(Method)。...这个方法是使用Class对象对应类的默认构造器创建对象,这就要求Class对象对应类必须要有默认构造器。 2、使用Class对象获取指定
  • Java试题-5:应用反射创建对象,调用对象方法 反射为Java的高级技术应用
  •   反射Java中至关重要的一个概念,我们必须要对它进行掌握。 1. 反射概念   反射指的是对对象的反向处理操作。所谓反向指的是根据对象来获得对象的来源信息(对象类的来源信息 包名.类名)。   为了区分...
  • java基础-反射3(反射,反射创建对象,操作对象属性,调用对象方法)前面通过学习,我们了解的运行时类型信息的基本原理,以及通过Class对象和反射来获取运行时类型信息。下面来了解通过反射来创建对象,以及操作...
  • 通过对象获取创建对象的类型信息。 对类型(类)的一个抽象,就是JDK中的Class类; Class也是一个类,用来描述其他类的信息。 (二)Class对象的三种获取方式 序号 方式 1 通过对象的getClass()方法获取...
  • JAVA反射机制创建对象

    千次阅读 2017-12-15 16:04:49
    java语言并不是一动态语言,也就是说在运行时不能改变程序结构或者变量类型,但是JAVA提供了反射技术,可以让我们在运行时加载所需要的类。反射的英文单词是reflect,也可以翻译成为映像,个人认为叫映像可能更好...
  • Java - 如何通过反射创建对象

    万次阅读 2019-03-16 23:46:32
    分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!... - 方法1:通过类对象调用...- 方法2:通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Cons...
  • Java反射机制(创建Class对象的三种方式) 1:了解什么是反射机制? 在通常情况下,如果有一个类,可以通过类创建对象;但是反射就是要求通过一个对象找到一个类的名称;   2:在反射操作中,握住一个核心概念...
  • 1.Class对象获取的三种方式 上一章节已经说过,一般情况下,Java反射操作都需要首先获取Class对象。获取Class对象的方式有三种。 公有属性class 方法getClass() Class.forName() 下面是示例代码: /** * &...
  • Exception in thread "main" java.lang.InstantiationException: java.lang.Integer at java.lang.Class.newInstance(Class.java:427) at top.clearlight.coretech.reflect.ReflectTest.main(ReflectTest.j...
  • 源头:获取Class对象,用三种方式 phone iPhone=new phone(); //1.1.对象.getClass();获取对象 Class<?> clazz1 = iPhone.getClass(); //1.2.类.class clazz1=phone.class; //1.3.Class....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 215,761
精华内容 86,304
关键字:

java反射创建对象三种

java 订阅