反射的机制

反射机制

##今天自学了反射,在此把笔记分享给大家,希望对初学的朋友有帮助

​ 三建四句(建库、建表、建约束、增删改查)

​ 建库

​ create database k9501_pp ;

​ create database if not exists k9501_pp default character utf8;

​ 建表、建约束

​ create table people(

​ id int primary key aotu_increment,

​ name varchar(64) not null,

​ age int default 18

​ );

​ 查

​ select * from people

​ 增

​ insert into people(id,name,sex,age,address,aslary,idcard,demp_id) values(null,“TM”,“男”,18,“约德尔人”,6300,121,2);

​ 改

​ update people set name =“提莫” where id = 12;

​ 删

​ delete from people where id =12;

​ 链表查询

​ 1.等值连接

​ 2.内连接(inner join…on…)

​ 3.左连接(left join…on…)

​ 4.右链接(right join…on…)

​ 子查询

​ 1.标量子查询:返回单一值的标量,最简单的形式。

​ 2.列子查询:返回的结果集是 N 行一列。

​ 3.行子查询:返回的结果集是一行 N 列。

​ 4.表子查询:返回的结果集是 N 行 N 列。

1.类加载器

类的加载

步骤

​ 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。

加载
就是指将class文件读入内存,并为之创建一个Class对象。
任何类被使用时系统都会建立一个Class对象。

连接
验证 是否有正确的内部结构,并和其他类协调一致
准备 负责为类的静态成员分配内存,并设置默认初始化值
解析 将类的二进制数据中的符号引用替换为直接引用

初始化

public class Father{
    static {
        System.out.println("父类静态代码块");
    }
    {
        System.out.println("父类代码块");
    }
    public Father(){
        System.out.println("父类无参构造方法");
        showFather();
    }
     public void showFather(){
        System.out.println("父类成员方法showFather");
    }
}
public class Son extends Father{
     static {
        System.out.println("子类静态代码块");
    }
    {
        System.out.println("子类代码块");
    }
    public Son(){
        System.out.println("子类无参构造方法");
        showSon();
    }
    public void showSon(){
        System.out.println("子类成员方法showSon");
    }
}

public class Father_Son_Demo{
    public static void main(String[] args){
        new Son();
    }
}

父类静态代码块–子类静态代码块–父类代码块–父类无参构造方法–父类成员方法showFather–
子类代码块–子类无参构造方法–子类成员方法showSon

类初始化时机

public class People{
    public static fianl MIN_AGE = 0;
    public static int getMIN_AGE(){
        return MIN_AGE;
    }
}

public class Student extends People{}
	
  • 创建类的实例

    People p = new People();
    
  • 访问类的静态变量,或者为静态变量赋值

    People.MIN_AGE
    
  • 调用类的静态方法

    People.getMIN_AGE();
    
  • 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象

    Class.forName("com.whhp.Student");
    
  • 初始化某个类的子类

    Student s = new Student(); 
    
  • 直接使用java.exe命令来运行某个主类

     javac Student.java      
     java Student
    

类加载器

类加载器:

​ 负责将.class文件加载到内在中,并为之生成对应的Class对象。

虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行。

类加载器的组成:

  • Bootstrap ClassLoader

    ​ 根类加载器

  • Extension ClassLoader

    ​ 扩展类加载器

  • Sysetm ClassLoader

    ​ 系统类加载器

类加载器的作用:

  • Bootstrap ClassLoader 根类加载器
    也被称为引导类加载器,负责Java核心类的加载
    比如System,String等。在JDK中JRE的lib目录下rt.jar文件中

  • Extension ClassLoader 扩展类加载器

    ​ 负责JRE的扩展目录中jar包的加载。
    ​ 在JDK中JRE的lib目录下ext目录

  • Sysetm ClassLoader 系统类加载器

    ​ 负责在JVM启动时加载来自java命令的class文件,

    ​ 以及classpath环境变量所指定的jar包和类路径

通过以上描述我们就可以知道我们常用的东西的加载都是由谁来完成的。
到目前为止我们已经知道把class文件加载到内存了,那么,如果我们仅仅站在这些class文件的角度,我们如何来使用这些class文件中的内容呢?
这就是我们反射要研究的内容。

2.反射机制(reflect)

反射机制的概念:

​ JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

​ 反射其实就是把java类中的各种成员映射成一个个的Java对象

1555771651000

加载完类之后,在堆内存中,就产生了一个 Class 类型的对象(一个类只有一个 Class 对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射。

如何获取Class对象呢

获取Class对象的方式

​ 1.根据对象获取

​ Person p = new Person();

​ Class c = p.getClass();

​ 2.根据类获取

​ Class c2 = Person.class;

​ 任意数据类型都具备一个class静态属性,看上去要比第一种方式简单.

​ 3:根据Class类中的静态方法

​ 将类名作为字符串传递给Class类中的静态方法forName即可
​ Class c3 = Class.forName(“com.whhp.Person”);

那我们改怎么使用呢 ?

​ 第三种和前两种的区别前两种你必须明确Person类型.后面是你我这种类型的字符串就行.这种扩展更强.我不需要知道你的类.我只提供字符串,按照配置文件加载就可以了

Class类中

根据Class对象获取存储构造方法的对象

​ 获取单个公共的构造方法对象

​ public Constructor getConstructor(Class<?>… parameterTypes)

​ 获取所有公共的构造方法对象

​ public Constructor<?>[] getConstructors()

​ 获取单个任意的构造方法对象(可以是私有的,或受保护、默认、公有)

​ public Constructor getDeclaredConstructor(Class<?>… parameterTypes)

​ 获取所有的构造方法对象(可以是私有的,或受保护、默认、公有)

​ public Constructor<?>[] getDeclaredConstructors()

我们可以通过Class对象中的方法,可以获取存储构造方法的对象,问大家构造方法的作用是什么呢?

创建对象、初始化成员变量、访问父类的构造方法,

现在我们就需要创建对象了。

Constructor类

	通过构造对象创建类对象
		public T newInstance(Object... initargs)

​ 父类:AccessibleObject

​ public void setAccessible(boolean flag)

​ flag=true 允许访问私有的构造方法

Class类中

根据Class对象获取存储成员变量的对象

​ 获取单个属性

​ 获取公共的成员变量

			public Field getField()

​ 获取指定成员变量(可以是私有的,或受保护、默认、公有)

			public Field getDeclaredField()

​ 获取所有属性

​ 获取所有公共的成员变量

			public Field[] getFields()

​ 获取所有的成员变量(可以是私有的,或受保护、默认、公有)

			public Field[] getDeclaredFields()

Field类中

​ 给属性赋值

		public void set(Object obj,Object value)

​ 父类:AccessibleObject

		public void setAccessible(boolean flag)  

​ flag=true 允许访问私有的成员变量

Class类中

根据Class对象获取存储成员方法的对象

​ 获取单个成员方法

​ 获取公共的成员方法

			public Method getMethod();

​ 获取指定的成员方法(可以是私有的,或受保护、默认、公有)

			public Method getDeclaredMethod();

​ 获取所有成员方法

​ 获取所有公共的成员方法

			public Method[] getMethods()

​ 获取所有的成员方法(可以是私有的,或受保护、默认、公有)

			public Method[] getDeclaredMethods();

Method类中

​ 调用方法

		public Object invoke(Object obj, Object... args)

​ 父类:AccessibleObject

		public void setAccessible(boolean flag)  

​ flag=true 允许访问私有的成员变量

反射是框架设计的灵魂
(使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码))

猜你喜欢

转载自blog.csdn.net/weixin_44793467/article/details/89760886
今日推荐