- java文件编译成class文件即字节码文件由类加载器负责将其加载到内存
- 类加载用到即加载,不用则不加载
- 类加载过程:加载 – 验证 – 准备 – 解析 – 初始化
- 加载:即通过包名+类名形式 获取这个类,并准备用流的形式进行传输 ,在这个类加载到内存中,会创建一个class对象用于记录成员信息
- 验证:即检查文件中信息是否符合虚拟机规范,有没有安全隐患
- 准备:即初始化静态变量
- 解析:即本类中如果用到其他类,应找到相对应的类,例如:String引用类
- 初始化:即静态变量赋值,以及初始化其他资源
- 类加载器的分类:
- 启动类加载器:虚拟机内置的类加载器
- 平台类加载器:负责加载jdk中一些特殊的模块
- 系统加载器:负责加载用户路径上指定的类库(常用)
- 自定义加载器:自定义
- 双亲委派模型
public class Test01 {
public static void main(String[] args) throws IOException {
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
ClassLoader classLoader1 = classLoader.getParent();
ClassLoader classLoader2 = classLoader1.getParent();
System.out.println("系统类加载器"+classLoader);
System.out.println("平台类加载器"+classLoader1);
System.out.println("启动类加载器"+classLoader2);
ClassLoader classLoader3 = ClassLoader.getSystemClassLoader();
InputStream resourceAsStream = classLoader.getResourceAsStream("ppt.properties");
Properties pro = new Properties();
pro.load(resourceAsStream);
System.out.println(pro);
resourceAsStream.close();
}
}
- java反射机制:利用反射机制创建对象,即无视任何属性和方法的修饰符
- 获取反射对象三种方式
- class.forname(包名+类名)
- 类名.class
- 创建对象,用其对象名调用getclass方法
public class Test02 {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> aClass = Class.forName("com.songzhang.packag1.Classloader.Student");
Class<Student> studentClass = Student.class;
Student stu = new Student();
Class<? extends Student> aClass1 = stu.getClass();
}
}
public class Student {
private String name;
private int age;
private char sex = '男';
public String height;
public String money ="1000" ;
public Student() {
}
public Student(String name, int age, char sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
private Student(String name){
System.out.println("私有化单个有参构造方法");
}
private Student(String name,char sex){
System.out.println("私有化多个参数构造方法");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", sex=" + sex +
", height='" + height + '\'' +
", money='" + money + '\'' +
'}';
}
public String function(String name){
System.out.println("有参有返回值");
return "张三";
}
public void function1(String name){
System.out.println("有参无返回值");
}
public void function2(){
System.out.println("无参无返回值");
}
private void function3(){
System.out.println("私有化无参无返回值");
}
private String function4(String name){
System.out.println("私有化有参有返回值");
return "李四";
}
}
public class Test03 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
methods1();
methods2();
methods3();
methods4();
methods5();
methods6();
MemberMethod1();
MemberMethod2();
MemberMethod3();
MemberMethod4();
setmethods();
getmethods();
method1();
method2();
method3();
method4();
invokemethod();
}
private static void invokemethod() throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
Class<?> aClass = Class.forName("com.songzhang.packag1.Classloader.Student");
Method function = aClass.getDeclaredMethod("function", String.class);
Student Stu = (Student) aClass.newInstance();
Object invoke = function.invoke(Stu, "王五");
System.out.println(invoke);
}
private static void method4() throws ClassNotFoundException, NoSuchMethodException {
Class<?> aClass = Class.forName("com.songzhang.packag1.Classloader.Student");
Method function3 = aClass.getDeclaredMethod("function3");
System.out.println(function3);
}
private static void method3() throws ClassNotFoundException, NoSuchMethodException {
Class<?> aClass = Class.forName("com.songzhang.packag1.Classloader.Student");
Method function1 = aClass.getMethod("function1", String.class);
System.out.println(function1);
}
private static void method2() throws ClassNotFoundException {
Class<?> aClass = Class.forName("com.songzhang.packag1.Classloader.Student");
Method[] methods = aClass.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
}
private static void method1() throws ClassNotFoundException {
Class<?> aClass = Class.forName("com.songzhang.packag1.Classloader.Student");
Method[] methods = aClass.getMethods();
for (Method method : methods) {
System.out.println(method);
}
}
private static void getmethods() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {
Class<?> aClass = Class.forName("com.songzhang.packag1.Classloader.Student");
Field sex = aClass.getDeclaredField("sex");
Student Stu = (Student) aClass.newInstance();
sex.setAccessible(true);
Object o = sex.get(Stu);
System.out.println(o);
}
private static void setmethods() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {
Class<?> aClass = Class.forName("com.songzhang.packag1.Classloader.Student");
Field height = aClass.getField("height");
Student Stu = (Student) aClass.newInstance();
height.set(Stu,"175");
System.out.println(Stu);
}
private static void MemberMethod4() throws ClassNotFoundException, NoSuchFieldException {
Class<?> aClass = Class.forName("com.songzhang.packag1.Classloader.Student");
Field name = aClass.getDeclaredField("name");
System.out.println(name);
}
private static void MemberMethod3() throws ClassNotFoundException, NoSuchFieldException {
Class<?> aClass = Class.forName("com.songzhang.packag1.Classloader.Student");
Field money = aClass.getField("money");
System.out.println(money);
}
private static void MemberMethod2() throws ClassNotFoundException {
Class<?> aClass = Class.forName("com.songzhang.packag1.Classloader.Student");
Field[] declaredFields = aClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
}
private static void MemberMethod1() throws ClassNotFoundException {
Class<?> aClass = Class.forName("com.songzhang.packag1.Classloader.Student");
Field[] fields = aClass.getFields();
for (Field field : fields) {
System.out.println(field);
}
}
private static void methods6() throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
Class<?> aClass = Class.forName("com.songzhang.packag1.Classloader.Student");
Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class);
declaredConstructor.setAccessible(true);
Student Stu1 = (Student) declaredConstructor.newInstance("张三");
System.out.println(Stu1);
}
private static void methods5() throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
Class<?> aClass = Class.forName("com.songzhang.packag1.Classloader.Student");
Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class, int.class, char.class);
Student Stu = (Student) declaredConstructor.newInstance("张三", 66, '男');
System.out.println(Stu);
}
private static void methods4() throws ClassNotFoundException, NoSuchMethodException {
Class<?> aClass = Class.forName("com.songzhang.packag1.Classloader.Student");
Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class);
System.out.println(declaredConstructor);
}
private static void methods3() throws ClassNotFoundException, NoSuchMethodException {
Class<?> aClass = Class.forName("com.songzhang.packag1.Classloader.Student");
Constructor<?> constructor = aClass.getConstructor(String.class,int.class,char.class);
System.out.println(constructor);
}
private static void methods2() throws ClassNotFoundException {
Class<?> aClass = Class.forName("com.songzhang.packag1.Classloader.Student");
Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();
for (Constructor<?> declaredConstructor : declaredConstructors) {
System.out.println(declaredConstructor);
}
}
private static void methods1() throws ClassNotFoundException {
Class<?> aClass = Class.forName("com.songzhang.packag1.Classloader.Student");
Constructor<?>[] constructors = aClass.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
}
}
}