通过类的字节码文件对象获取构造方法并创建对象

package com.shujia.day21;

import java.lang.reflect.Constructor;
import java.util.Arrays;

/*
    类中的三大成员:
        成员变量:Field
        构造方法:Constructor
        成员方法:Method

    获取构造方法,通过类的字节码文件对象进行获取
    public Constructor<T> getConstructor(Class<?>... parameterTypes) 获取一个类中某一个公共的构造方法
            getConstructors          获取类中所有公共的构造方法
            getDeclaredConstructors  获取类中所有的构造方法,包括私有的
    创建对象 通过获取的构造方法进行创建对象
            newInstance()
            con.newInstance(“zhangsan", 20);

    反射获取构造方法并创建对象
    调用私有的构造方法赋值需要先进行暴力访问  c3.setAccessible(true);
 */
public class StructureDemo1 {
    public static void main(String[] args) throws Exception{
        //如何通过反射获取一个类中的构造方法,并创建对象
        //获取类的Class对象
        Class<?> studentClass = Class.forName("com.shujia.day21.Student");

        //public Constructor<T> getConstructor(Class<?>... parameterTypes) 获取一个类中某一个公共的构造方法
        //获取一个类中无参的公共的构造方法
        Constructor<?> c1 = studentClass.getConstructor(); // 无参的构造方法
        System.out.println(c1);
        //获取一个有一个参数是String类型的构造方法
        Constructor<?> c2 = studentClass.getConstructor(String.class);
        System.out.println(c2);
//        Constructor<?> c3 = studentClass.getConstructor(String.class, int.class);
//        System.out.println(c3);
        //如何获取私有的构造方法
        Constructor<?> c3 = studentClass.getDeclaredConstructor(String.class, int.class);
        System.out.println(c3);

        System.out.println("------------------------------------------------");
        //getConstructors() 获取类中所有公共的构造方法
        Constructor<?>[] cs = studentClass.getConstructors();
        System.out.println(Arrays.toString(cs));

        System.out.println("------------------------------------------------");
        //获取类中所有的构造方法,包括私有的
        Constructor<?>[] cs2 = studentClass.getDeclaredConstructors();
        System.out.println(Arrays.toString(cs2));
        System.out.println("------------------------------------------------");
        //如何通过获取的构造方法进行创建对象
        //newInstance(Object ... initargs)
        Object o = c1.newInstance();
        System.out.println(o);
        System.out.println("------------------------------------------------");
        Object o2 = c2.newInstance("魏一民");
        System.out.println(o2);
        System.out.println("------------------------------------------------");
        c3.setAccessible(true); // 暴力访问
        Object o3 = c3.newInstance("魏一民", 18);
        System.out.println(o3);


    }
}

package com.shujia.day21;

public class Student {
    private String name;
    int age;
    protected String address;
    public int phoneNum;

    public Student() {

    }

    public Student(String s) {
        System.out.println("带参数的公共构造方法" + s);
    }

    protected Student(int i) {
        System.out.println("带参数的受保护构造方法" + i);
    }

    Student(double d) {
        System.out.println("带参数的默认修饰符构造方法" + d);
    }

    private Student(String name, int age) {
        System.out.println("带参数的私有构造方法" + name + "," + age);
    }

    public void fun1() {
        System.out.println("这是公共的成员方法");
    }

    public String fun1(String s) {
        System.out.println("这是公共的成员方法" + s);
        return "数加:" + s;
    }

    protected void fun2(){
        System.out.println("这是受保护的成员方法");
    }

    void fun3(){
        System.out.println("这是默认的成员方法");
    }

    private void fun4(){
        System.out.println("这是私有的成员方法");
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                ", phoneNum=" + phoneNum +
                '}';
    }
}
posted @ 2024-08-23 21:20  ていせい  阅读(1)  评论(0编辑  收藏  举报