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