这是刘意老师的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.通过用户的增删改查和学生登录注册引入中介
三、动态代理
代理:本来应该自己做的事情,却请了别人来做,被请的人就是代理对象。
举例:春季回家买票让人代买动态代理:在程序运行过程中产生的这个对象而程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以,动态代理其实就是通过反射来生成一个代理(我也没太听懂)