Java反射笔记

Java反射

疑问1:通过new的方式或反射的方式都可以调用公共的结构,开发中到底用哪个?

  1. new的方式是在确定要造具体的类的对象时选择用,
  2. 反射机制是在不确定要创建哪个类的对象时,使用,目前我的理解是反射机制和泛型一样是一个模板,主要体现在动态性(可以在服务器上理解这个技术)

疑问2:反射机制与面向对象中的封装性是不是矛盾的?如何看待两个技术?

答:不矛盾。

首先分析什么是面向对象的封装性,其主要体现是将属性和方法设置为私有的使其在其他类中调用时无法访问该类中内部的私有属性和私有方法。要想使用其私有属性和私有方法则应该使用该类内部的public方法进行调用

反射机制是动态的。可以调用私有方法,但是不建议用。

关于Java.lang.Class类的理解

  1. 类的加载过程:

    程序经过javac.exe命令以后,会生成一个或多个字节码文件(.class结尾),接着使用Java.exe命令对某个字节码文件进行解释运行。相当于将某个字节码文件加载到内存中,此过程称为类的加载。加载到内存中的类,我们就称为运行时类,此运行时类,就作为Class的一个实例。

    万事万物皆对象? 对象.xxx,File,URL,反射,前端、数据库操作

  2. 换句话说,Class的实例就对应着一个运行时类

  3. 加载到内存中的运行时类,会缓存一定的时间,在此时间之内,我们可以通过不同的方式来获取此运行时类。

    //获取Class的实例的方式(掌握以下三种)
     //方式1:调用运行时类的属性:.class
    Class clazz1 = Person.class;
    System.out.println(clazz1);
    //方式2:通过运行时类的对象,调用getClass();
    Person p1 = new Person();
    Class clazz2 = p1.getClass();
    System.out.println(clazz2);
    
    //方式3:调用Class的静态方法:forName(String classPath)
    Class clazz3 = Class.forName("Person");
    System.out.println(clazz3 );
    
    System.out.println(clazz1 == clazz2);//true
    System.out.println(clazz1 == clazz3);//true
    

了解类的加载器

//对于自定义类,使用系统类加载器进行加载
ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
//调用系统类加载的getParent():获取扩展类加载器
ClassLoader classLoader1 = classLoader.getParent();
//调用系统类加载的getParent():无法获取引导类加载器
//引导类加载器主要负责加载Java的核心类库,无法加载自定义类
ClassLoader classLoader2 = classLoader.getParent();//null

通过反射创建对应的运行时类的对象

Class<Person> clazz = Person.class;
/*
newInstance():调用此方法,创建对应的运行时类的对象,内部是调用了运行时类的空参的构造器

要想此方法正常的创建运行时类的对象,要求
	1.运行时类必须提供空参的构造器
	2.空参的构造器访问权限需要满足,通常设置为public
	
在Javabean中要求提供一个public的空参构造器,原因:
	1.便于通过反射,创建运行时类的对象
	2.便于子类继承此运行时类时,默认调用super()时,保证父类有此构造器  
*/
Person obj = clazz.newInstance();
System.out.printIn(obj);
posted @ 2021-04-14 16:58  LMoro  阅读(66)  评论(0)    收藏  举报