反射

 

package com.fh.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 获得类的运行时结构
 */
public class RunTimeClassTest {
    public static void main(String[] args) throws Exception {

        /**
         * 访问无参构造函数
         */
        Class<?> aClass = Class.forName("com.fh.reflection.Stu");
        Stu stu = (Stu) aClass.newInstance();
        System.out.println(stu);

        /**
         * 访问有参私有构造函数
         */
        aClass = Class.forName("com.fh.reflection.Stu");
        Constructor<?> declaredConstructor1 = aClass.getDeclaredConstructor(Integer.class, String.class);
        declaredConstructor1.setAccessible(true);
        stu = (Stu) declaredConstructor1.newInstance(12,"王子啊");
        System.out.println(stu);

        /**
         * 通过反射调用调用方法
         */
        aClass = Class.forName("com.fh.reflection.Stu");
        Method setName = aClass.getDeclaredMethod("setName", String.class);
        //给stu对象绑定setName方法;给stu对象setName(name)参数name赋值
        setName.invoke(stu,"反射name赋值");

        Method getName = aClass.getDeclaredMethod("getName");
        //给stu对象绑定getName方法
        String getName_ = (String) getName.invoke(stu);
        System.out.println("【获得通过反射调用方法的返回值】"+getName_);

        /**
         * 通过反射调用属性
         */
        aClass = Class.forName("com.fh.reflection.Stu");
        stu = (Stu) aClass.newInstance();
        Field name = aClass.getDeclaredField("name");
        name.setAccessible(true);
        //给stu对象绑定name属性
        name.set(stu,"通过反射属性赋值");
        System.out.println(stu.getName());


    }
    public static void getClass_() throws NoSuchMethodException {
        Class<Stu> stuClass = Stu.class;
        System.out.println("【获得类名】"+stuClass.getName()+"-------"+stuClass.getSimpleName());
        Field[] declaredFields = stuClass.getDeclaredFields();

        System.out.println("【获取类的所有属性】");
        for (int i = 0; i < declaredFields.length; i++) {
            System.out.println(declaredFields[i]);
        }
        Field[] fields = stuClass.getFields();
        System.out.println("【获取类的public属性】");
        for (int i = 0; i < fields.length; i++) {
            System.out.println(fields[i]);
        }

        Method[] declaredMethods = stuClass.getDeclaredMethods();
        System.out.println("【获取类的所有方法】");
        for (int i = 0; i < declaredMethods.length; i++) {
            System.out.println(declaredMethods[i]);
        }
        Method[] methods = stuClass.getMethods();
        System.out.println("【获取类的public方法-父子类所有public方法】");
        for (int i = 0; i < methods.length; i++) {
            System.out.println(methods[i]);
        }
        Method getName = stuClass.getDeclaredMethod("getName",null);
        getName = stuClass.getDeclaredMethod("getName", String.class, String.class);
        System.out.println("【获得指定方法】"+getName);

        Constructor<?>[] declaredConstructors = stuClass.getDeclaredConstructors();
        System.out.println("【获取类的所有构造函数】");
        for (int i = 0; i < declaredConstructors.length; i++) {
            System.out.println(declaredConstructors[i]);
        }
        Constructor<?>[] constructors = stuClass.getConstructors();
        System.out.println("【获取类的public构造函数】");
        for (int i = 0; i < constructors.length; i++) {
            System.out.println(constructors[i]);
        }
        Constructor<Stu> declaredConstructor = stuClass.getDeclaredConstructor();
        //System.out.println("【获得指定构造函数】"+declaredConstructor);
        declaredConstructor = stuClass.getDeclaredConstructor(Integer.class, String.class);
        System.out.println("【获得指定构造函数】"+declaredConstructor);
    }
}
class Stu{
    private int id;
    private String name;
    public int o;

    public Stu(){
        this.name="!!!!";
    }

    private Stu(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public Stu setId(int id) {
        this.id = id;
        return this;
    }

    public String getName() {
        return name;
    }
    public String getName(String param1,String param2) {
        return name;
    }

    public Stu setName(String name) {
        this.name = name;
        return this;
    }
    private void privateM(){

    }

    @Override
    public String toString() {
        return "Stu{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

 

posted @ 2022-06-01 15:40  禁止摆烂  阅读(25)  评论(0)    收藏  举报