Java基础-反射基础学习

反射基本学习

反射概述:
  Java 反射机制:是指在运行时去获取一个类的变量和方法信息,然后通过获取到的信息来创建对象,调用方法的一种机制。
  由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期间仍然可以扩展。

获取Class类的对象:
  我们想要通过反射去使用一个类,首先我们要获取到该类的字节码文件对象,也就是类型为Class类型的对象,这里我们提供三种方式获取Class类型的对象。
  1.使用类的class属性来获取该类对应的Class对象。举例:Student.class将会返回Student类对应的Class对象
  2.调用对象的getClass()方法,返回该对象所属类对应的Class对象,该方法是Object类中的方法,所有的Java对象都可以调用该方法
  3.使用Class类中的静态方法forName(String className),该方法需要传入字符串参数,该字符串参数的值是某个类的全路径,也就是完整的包名的路径

反射获取构造方法并使用:

  Class 类中用于获取构造方法的方法
  Constructor<?>[]getConstructors():返回所有公共构造方法对象的数组
  Constructor<?>[]getDeclaredConstructors():返回所有构造方法对象的数组
  Constructor<?>[]getConstructor(Class<?>…parameterTypes):返回单个公共构造方法对象
  Constructor<?>[]getDeclaredConsructor(Class<?>…parameterTypes):返回单个构造方法对象

Constructor类中用于创建对象的方法:
  T newInstance(Object…initargs):根据指定的构造方法创建对象

ReflectDemo.java测试类

public class ReflectDemo {
   
    /*
    三种方式获取class对象:
            1.使用类的class属性来获取该类对应的Class对象。举例:Student.class将会返回Student类对应的Class对象
            2.调用对象的getClass()方法,返回该对象所属类对应的Class对象,该方法是Object类中的方法,所有的Java对象都可以调用该方法
            3.使用Class类中的静态方法forName(String className),该方法需要传入字符串参数,该字符串参数的值是某个类的全路径,也就是完整的包名的路径
     */

    public static void main1(String[] args) throws ClassNotFoundException {
   
        //使用类的class属性来获取该类对应的Class对象。举例:Student.class将会返回Student类对应的Class对象
        Class<Student> c1 = Student.class;
        System.out.println(c1);

        Class<Student> c2 = Student.class;
        System.out.println(c2);

        System.out.println(c1 == c2);

        System.out.println("-------------------");

        //调用对象的getClass()方法,返回该对象所属类对应的Class对象,该方法是Object类中的方法,所有的Java对象都可以调用该方法
        Student s = new Student();
        Class<? extends Student> c3 = s.getClass();
        System.out.println(c3);
        System.out.println(c1 == c3);

        System.out.println("-------------------");

        //使用Class类中的静态方法forName(String className),该方法需要传入字符串参数,该字符串参数的值是某个类的全路径,也就是完整的包名的路径
        Class<?> c4 = Class.forName("Day15.反射.Student");
        System.out.println(c1 == c4);
/*
结果:
class Day15.反射.Student
class Day15.反射.Student
true
-------------------
class Day15.反射.Student
true
-------------------
true
*/

    }


    /*
    Class 类中用于获取构造方法的方法
        Constructor<?>[]getConstructors():返回所以公共构造方法对象的数组
        Constructor<?>[]getDeclaredConstructors():返回所有构造方法对象的数组
        Constructor<?>[]getConstructor(Class<?>...parameterTypes):返回单个公共构造方法对象
        Constructor<?>[]getDeclaredConsructor(Class<?>...parameterTypes):返回单个构造方法对象

    Constructor类中用于创建对象的方法:
        T newInstance(Object...initargs):根据指定的构造方法创建对象
     */
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
   
        //获取Class对象
        Class<?> c = Class.forName("Day15.反射.Student");

        /*
        //Constructor<?>[] getConstructors()返回一个包含Constructor对象的数组,Constructor对象反映了由该Class对象表示的类的,所有公共构造函数
        Constructor<?>[] cons = c.getConstructors();
        for (Constructor con : cons) {
            System.out.println(con);
        }

         */

        //Constructor<?>[] getDeclaredConstructors() 返回反映由该Class对象表示的类的,所有构造函数的Constructor对象数组
        Constructor<?>[] cons = c.getDeclaredConstructors();
        for (Constructor con : cons) {
   
            System.out.println(con);
        }
        System.out.println("---------------");

        //Constructor<?>[] getConstructor(Class<?>...parameterTypes)返回一个Constructor对象,该对象反映由该Class对象表示的类的指定 公共 构造函数
        //Constructor<?>[] getDeclaredConstructor(Class<?>...parameterTypes)返回一个Constructor对象,该对象反映由该Class对象表示的类或者接口的指定构造函数
        //参数:你要获取的构造方法的参数的个数和数据类型对应的字节码文件对象
        Constructor<?> con = c.getConstructor();

        //Constructor提供了一个类的单个构造函数的信息和访问权限
        //T newInstance(Object...initargs)使用由此Constructor对象表示的构造函数,使用指定的初始化参数来创建和初始化构造函数的声明类的实例
        Object obj = con.newInstance();
        System.out.println(obj);
    }
/*
结果://所有得构造方法
public Day15.反射.Student(java.lang.String,int,java.lang.String)
Day15.反射.Student(java.lang.String,int)
private Day15.反射.Student(java.lang.String)
public Day15.反射.Student()
---------------
Student{name='null', age=0, address='null'}
*/

}

ReflectDemo1.java 反射获取构造方法练习

public class ReflectDemo1 {
   
    /*
    练习1:
        通过反射实现如下操作:
            Student s = new Student("林青霞",30,"西安");
            System.out.println(s);

     基本数据类型也可以通过.class得到对应的class类型

     */
    publi
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值