类的加载与类加载器、反射与枚举

类的加载与类加载器、反射与枚举

对于上个博客的特注:在实现局域网内的互相发送与接收时,必须打开各自电脑的网络发现,否则将会出现发送不到、接收不到的情况。

1、类的加载

    (1)加载:就是指将class文件读入内存,并为之创建一个Class对象。任何类被使用  
 时系统都会建立一个Class对象。
    (2)连接
       验证:是否有正确的内部结构,并和其他类协调一致。
       准备:负责为类的静态成员分配内存,并设置默认初始值。
       解析:将类的二进制数据中的符号引用替换为直接引用。
    (3)初始化
       在类的初始化阶段,虚拟机负责对类进行初始化,主要是对静态属性进行初始化。

2、类加载器的分类:

Bootstrap ClassLoader    根类加载器
Extension ClassLoader    扩展类加载器
System ClassLoader       系统类加载器
package com.hwadee;

public class Student {

        //  字段   fields
        int age;
        String name;
        //构造方法   constructor
        public Student() {
            System.out.println("这是无参构造方法");
        }
        public Student(int age,String name) {
            this.age=age;
            this.name=name;
        }
        //方法   method
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public void printStudentInfo() {

        }
}
package com.hwadee;
//对象名.getClass()    类名.class    Class.forName("路径名.类名");这三个都是获取Student的字节码文件
public class Test1 {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        TestGetClass();
    }

    public static void TestGetClass() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        Student s1=new Student();
        Class clazz1=s1.getClass();

        Class clazz2=Student.class;

        Class clazz3 = Class.forName("com.hwadee.Student");

        Student s2 = (Student)clazz1.newInstance();  //通过字节码文件创建Student对象--->newInstance
    }

}

这里写图片描述
3、通过反射获取构造方法

package com.hwadee;

public class Star {
    public String name;
    private String city;
    private int age;
    public Star() {

    }
    private Star(String name) {
        this.name=name;
    }
    public Star(String name, String city, int age) {
        super();
        this.name = name;
        this.city = city;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Star [name=" + name + ", city=" + city + ", age=" + age + "]";
    }

    private void Gossip(String message) {
        System.out.println("爆料!!!"+message);
    }


}
package com.hwadee;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Test2 {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        test1();
        test2();
        test3();
    }
    public static void test1() throws ClassNotFoundException {
        Class clazz = Class.forName("com.hwadee.Star");
        Constructor[] constructor = clazz.getConstructors();
        for(Constructor c:constructor) {
            System.out.println(c);
        }
    }

    public static void test2() throws ClassNotFoundException {
        Class clazz = Class.forName("com.hwadee.Star");
        Constructor[] constructors = clazz.getDeclaredConstructors();
        for(Constructor c:constructors) {
            System.out.println(c);
        }
    }
    public static void test3() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        Class clazz = Class.forName("com.hwadee.Star");
        Constructor constructors = clazz.getDeclaredConstructor(String.class);
        constructors.setAccessible(true);
        Object newInstance = constructors.newInstance("不错呀");
        Star s=(Star)newInstance;
        System.out.println(s);
    }
}

这里写图片描述
4、通过反射获取成员变量

package com.hwadee;

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

public class Test3 {

    public static void main(String[] args) throws Exception {
        test1();
        test2();
        test3();
        test4();
    }
    public static void test1() throws ClassNotFoundException {
        Class clazz=Class.forName("com.hwadee.Star");
        Field[] fields = clazz.getFields();
        for(Field f:fields) {
            System.out.println(f);
        }
    }
    public static void test2() throws ClassNotFoundException {
        Class clazz=Class.forName("com.hwadee.Star");
        Field[] fields = clazz.getDeclaredFields();
        for(Field f:fields) {
            System.out.println(f);
        }
    }
    public static void test3() throws ClassNotFoundException {
        Class clazz=Class.forName("com.hwadee.Star");
        Field[] fields = clazz.getDeclaredFields();
        int pub=Modifier.PUBLIC;
        System.out.println("pub="+pub);

        int pri=Modifier.PRIVATE;
        System.out.println("pri="+pri);
        for(Field f:fields) {
            Class<?> type = f.getType();
            int modifiers = f.getModifiers();
            System.out.println(f+"----"+type+"   "+modifiers);
        }
    }
    public static void test4() throws Exception {
        Class<?> clazz = Class.forName("com.hwadee.Star");
        Constructor<?> c = clazz.getDeclaredConstructor(String.class);
        c.setAccessible(true);
        Object obj = c.newInstance("江疏影");
        Star star=(Star)obj;

        Field field = clazz.getDeclaredField("age");
        field.setAccessible(true);
        field.set(star, 28);

        Field field2 = clazz.getDeclaredField("city");
        field2.setAccessible(true);
        field2.set(star, "北京");

        System.out.println(star);
    }


}

这里写图片描述
5、通过反射获取方法

package com.hwadee;

import java.lang.reflect.Method;

public class Test4 {

    public static void main(String[] args) throws Exception {
        test1();
        test2();
        test3();
        test4();
    }
    public static void test1() throws ClassNotFoundException {
        Class<?> clazz = Class.forName("com.hwadee.Star");
        Method[] methods = clazz.getMethods();
        for(Method m:methods) {
            System.out.println(m);
        }
    }
    public static void test2() throws ClassNotFoundException {
        Class<?> clazz = Class.forName("com.hwadee.Star");
        Method[] methods = clazz.getDeclaredMethods();
        for(Method m:methods) {
            System.out.println(m);
        }
    }
    public static void test3() throws ClassNotFoundException {
        Class<?> clazz = Class.forName("com.hwadee.Star");
        Method[] methods = clazz.getDeclaredMethods();
        for(Method m:methods) {
            System.out.println(m+"----"+m.getReturnType());
        }
    }
    public static void test4() throws Exception {
        Class<?> clazz = Class.forName("com.hwadee.Star");
        Object obj = clazz.newInstance();
        Star star=(Star)obj;
        Method method = clazz.getDeclaredMethod("Gossip", String.class);
        method.setAccessible(true);
        //以前   对象.方法名(输入参数)

        Object invoke = method.invoke(star, "刘亦菲还是那个小龙女");
        //System.out.println(invoke);
    }
}

这里写图片描述
这里写图片描述
6、枚举

是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。
    回想单例设计模式:单例类是一个类只有一个实例,那么多例类就是一个类有多个实  
例,但不是无限个数的实例,而是有限个数的实例,这才能是枚举类。
    package com.hwadee;

public enum EasonEnum {
    SPRING,FALL,SUMMER,WINTER;
}
package com.hwadee;

import javax.swing.text.StyledEditorKit.ForegroundAction;

public class Test5 {

    public static void main(String[] args) {
        test1(EasonEnum.WINTER);
        EasonEnum[] values = EasonEnum.values();
        for(EasonEnum s:values) {
            System.out.println(s);
        }
    }
    public static void test1(EasonEnum s) {
        switch (s) {
        case SPRING:
            System.out.println("春暖花开");
            break;
        case SUMMER:
            System.out.println("夏至未至");
            break;
        case FALL:
            System.out.println("秋高气爽");
            break;
        case WINTER:
            System.out.println("冰冻三尺");
            break;
        default:
            System.out.println("地球没有这个季节!!!");
            break;
        }
    }
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值