这是刘意老师的JAVA基础教程的笔记
讲的贼好,附上传送门

传智风清扬-超全面的Java基础

一、类的加载

1.类初始化的时机

创建类的实例
访问类的静态变量,或者为静态变量赋值
调用类的静态方法
使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
初始化某个类的子类
直接使用java.exe命令来运行某个主类

2.类加载器

2.1.作用

负责将.class文件加载到内在中,并为之生成对应的Class对象。
虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行。

2.2.分类

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包和类路径

二、反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

class类包含:

  成员变量  Field

  构造方法  Consturctor

  成员方法  Method

并且把这三个东西都看做对象

1.获取class文件对象的三种方式

public class Demo {
    public static void main(String[] args) throws ClassNotFoundException {
        //方式1
        Person p=new Person();
        Class c=p.getClass();
        
        Person p2=new Person();
        Class c2=p.getClass();
        
        System.out.println(p==p2);
        System.out.println(c==c2);
        
        //方式2
        Class c3=Person.class;
        
        //方式3
        Class c4=Class.forName("demo1.Person");//要全路径
    }
}

2.通过反射获取无参构造方法并使用

package demo1;

import java.lang.reflect.Constructor;

public class Demo {
    public static void main(String[] args) throws Exception {
        Class c = Class.forName("demo1.Person");// 要全路径

        // 获取构造方法
        System.out.println("获取public构造方法");
        Constructor[] cons = c.getConstructors();
        for (Constructor constructor : cons) {
            System.out.println(constructor);
        }

        System.out.println("获取所有构造方法");
        cons = c.getDeclaredConstructors();
        for (Constructor constructor : cons) {
            System.out.println(constructor);
        }

        System.out.println("运用class字节码文件获取某个构造方法对象,并创建该类的实例");
        Constructor con = c.getConstructor();
        Object obj=con.newInstance();
        System.out.println(con);
    }
}

class Person {
    // 成员变量
    private String name;
    int age;
    public String address;

    // 构造方法
    public Person() {
    }
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Person(String name, int age, String address) {
        super();
        this.name = name;
        this.age = age;
        this.address = address;
    }

    // 成员方法
    public void show() {
        System.out.println("show");
    }
    public void method(String s) {
        System.out.println("method" + s);
    }
    public String getString(String s, int i) {
        return s + "---" + i;
    }
    private void function() {
        System.out.println("function");
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
    }
}

3.通过反射去获得含参构造方法

package demo1;

import java.lang.reflect.Constructor;

public class Demo {
    public static void main(String[] args) throws Exception {
        Class c = Class.forName("demo1.Person");// 要全路径

        System.out.println("运用class字节码文件获取某个构造方法对象,并创建该类的实例");
        Constructor con = c.getConstructor(String.class, int.class, String.class);
        Object obj = con.newInstance("zxy",23,"Xi'an");
        System.out.println(obj);
    }
}

class Person {
    // 成员变量
    private String name;
    int age;
    public String address;

    // 构造方法
    public Person() {
    }

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person(String name, int age, String address) {
        super();
        this.name = name;
        this.age = age;
        this.address = address;
    }

    // 成员方法
    public void show() {
        System.out.println("show");
    }

    public void method(String s) {
        System.out.println("method" + s);
    }

    public String getString(String s, int i) {
        return s + "---" + i;
    }

    private void function() {
        System.out.println("function");
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
    }
}

4.获取私有构造方法

package demo1;

import java.lang.reflect.Constructor;

public class Demo {
    public static void main(String[] args) throws Exception {
        Class c = Class.forName("demo1.Person");// 要全路径

        System.out.println("运用class字节码文件获取某个构造方法对象,并创建该类的实例");
        Constructor con = c.getDeclaredConstructor(String.class);
        con.setAccessible(true);//取消Java语言的访问检查
        Object obj = con.newInstance("zxy");
        System.out.println(obj);
    }
}

class Person {
    // 成员变量
    private String name;
    int age;
    public String address;

    // 构造方法
    public Person() {
    }

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    private Person(String name) {
        this.name = name;
    }

    public Person(String name, int age, String address) {
        super();
        this.name = name;
        this.age = age;
        this.address = address;
    }

    // 成员方法
    public void show() {
        System.out.println("show");
    }

    public void method(String s) {
        System.out.println("method" + s);
    }

    public String getString(String s, int i) {
        return s + "---" + i;
    }

    private void function() {
        System.out.println("function");
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
    }
}

5.通过反射调用方法

package demo1;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class Demo {
    public static void main(String[] args) throws Exception {
        Class c = Class.forName("demo1.Person");// 要全路径
        Constructor con = c.getConstructor();
        Object obj = con.newInstance();

        Method m1 = c.getMethod("show");//获取方法对象
        m1.invoke(obj);//调用哪个对象的这个方法

        Method m2 = c.getMethod("method", String.class);
        m2.invoke(obj, "123");

        Method m3 = c.getDeclaredMethod("function");
        m3.setAccessible(true);
        m3.invoke(obj);
    }
}

class Person {
    // 成员变量
    private String name;
    int age;
    public String address;

    // 构造方法
    public Person() {
    }

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    private Person(String name) {
        this.name = name;
    }

    public Person(String name, int age, String address) {
        super();
        this.name = name;
        this.age = age;
        this.address = address;
    }

    // 成员方法
    public void show() {
        System.out.println("show");
    }

    public void method(String s) {
        System.out.println("method" + s);
    }

    public String getString(String s, int i) {
        return s + "---" + i;
    }

    private void function() {
        System.out.println("function");
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
    }
}

6.通过反射调用成员变量

package demo1;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

public class Demo {
    public static void main(String[] args) throws Exception {
        Class c = Class.forName("demo1.Person");// 要全路径
        Constructor con=c.getConstructor();
        Object obj=con.newInstance();
        Field addressField = c.getField("address");
        addressField.set(obj, "xian");
        System.out.println(obj);
    }
}

class Person {
    // 成员变量
    private String name;
    int age;
    public String address;

    // 构造方法
    public Person() {
    }

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    private Person(String name) {
        this.name = name;
    }

    public Person(String name, int age, String address) {
        super();
        this.name = name;
        this.age = age;
        this.address = address;
    }

    // 成员方法
    public void show() {
        System.out.println("show");
    }

    public void method(String s) {
        System.out.println("method" + s);
    }

    public String getString(String s, int i) {
        return s + "---" + i;
    }

    private void function() {
        System.out.println("function");
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
    }
}

7.通过用户的增删改查和学生登录注册引入中介

三、动态代理

代理:本来应该自己做的事情,却请了别人来做,被请的人就是代理对象。
举例:春季回家买票让人代买
动态代理:在程序运行过程中产生的这个对象
而程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以,动态代理其实就是通过反射来生成一个代理

(我也没太听懂)


z_dominic
115 声望15 粉丝

你有freestyle吗?