初步了解,如何获取字节码对象和构造器

  • Post author:
  • Post category:其他


一 字节码对象的获取方式

1>给定字节码文件的全限定名(包名+类名)

2>通过对象去获取字节码对象

3>通过类的class字段去获取

代码如下–>

domain类

public class Student {
    /**
     * 自定义字段
     */
    String name;
    int    age;

    /**
     * 无参构造器
     */
    public Student(){}

    /**
     * 有参构造器
     * 默认无参构造器失效
     */
    public Student(String aName, int aAge){
        name = aName;
        age  = aAge;
    }

    /**
     * 自定义方法
     */
    public void sayHi(){
        System.out.println("你们好,我是" + name);
        System.out.println("今年:" + age);
        System.out.println("-------------");
    }

    /**
     * setter 和 getter 方法
     */
    public void setName(String aName){
        name = aName;
    }

    public String getName(){
        return name;
    }

    public void setAge(int Aage){
        age = Aage;
    }

    public int getAge(){
        return age;
    }

    /**
     * 自定义方法2
     */
    public void learn(String course){
        System.out.println(name + "今天学习了"+course+"课") ;
    }

    /**
     * 覆盖toString方法
     * @return
     */
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

测试类

/**
 * 字节码对象的获取方式
 */
public class TestClass01 {
    public static void main(String[] args) throws ClassNotFoundException {
        // 1>获取字节码对象
        // 给定字节码文件的全限定名(包名+类名)
        // jvm动态装载在workplace.practice.day0904.Student.class
        // clz就是workplace.practice.day0904.Student.class的字节码对象
        Class clz = Class.forName("workplace.practice.day0904.Student");
        System.out.println(clz);

        // 2>给定一个对象,通过对象去获取字节码对象
        Student stu = new Student();
        Class clzz = stu.getClass();
        System.out.println(clzz);
        // 字节码对象只有一个 比较地址得到true
        System.out.println(clz == clzz);

        // 3>直接通过类的class字段获取
        Class clzzz = Student.class;
        System.out.println(clzzz);
        System.out.println(clzzz == clz);
    }
}

二 构造器的获取

1>获取所有构造器

2>获取指定构造器

记得抛出异常

domain类

public class Student {
    /**
     * 自定义字段
     */
    String name;
    int    age;

    /**
     * 无参构造器
     */
    public Student(){}

    // 模拟私有构造器
    private Student(String aName){
        name = aName;
    }

    /**
     * 有参构造器
     * 默认无参构造器失效
     */
    public Student(String aName, int aAge){
        name = aName;
        age  = aAge;
    }

    /**
     * 自定义方法
     */
    public void sayHi(){
        System.out.println("你们好,我是" + name);
        System.out.println("今年:" + age);
        System.out.println("-------------");
    }

    /**
     * setter 和 getter 方法
     */
    public void setName(String aName){
        name = aName;
    }

    public String getName(){
        return name;
    }

    public void setAge(int Aage){
        age = Aage;
    }

    public int getAge(){
        return age;
    }

    /**
     * 自定义方法2
     */
    public void learn(String course){
        System.out.println(name + "今天学习了"+course+"课") ;
    }

    /**
     * 覆盖toString方法
     * @return
     */
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

测试类

/**
 * 获取所有构造器
 */
public class TestClass02_constructor {
    public static void main(String[] args) {
        Class clz = Student.class;
        // 构造器不止一个 所以用数组
        // getConstructors()获取的是公共的public
        Constructor[] constructors = clz.getConstructors();
        // 数组的话 就可以遍历里面的元素
        for (Constructor c1: constructors) {
            System.out.println(constructor);
        }

        // 分隔符
        System.out.println("--------------");

        // getDeclaredConstructors()获取private和public
        Constructor[] declaredConstructors = clz.getDeclaredConstructors();
        for (Constructor c2 : declaredConstructors) {
            System.out.println(constructor);
        }
    }
}
/**
 * 获取指定构造器
 */
public class TestClass02_constructor2 {
    public static void main(String[] args) throws NoSuchMethodException {
        Class clz = Student.class;
        //获取无参构造器
        Constructor c1 = clz.getConstructor();
        System.out.println(c1);

        //获取有参构造器
        Constructor c2 = clz.getConstructor(String.class, int.class);
        System.out.println(c2);

        //获取私有构造器
        Constructor c3 = clz.getDeclaredConstructor(String.class);
        System.out.println(c3);
    }
}



版权声明:本文为Bowl_IronMan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。