反射

参考:https://mp.weixin.qq.com/s/GDuqMY7TSicjHpZ4wDz2dA

获取Class对象的几种方式

public class MainTest {
    public static void main(String[] args) {        
        Student stu1=new Student();
        Class stuClass=stu1.getClass();
        System.out.println(stuClass.getName());  
    
        Class stuClass2=Student.class;
        System.out.println(stuClass==stuClass2);
        
        try {
            Class stuClass3=Class.forName("com.ref.test.Student");   一般情况下这种方式用的最常见
            System.out.println(stuClass2==stuClass3);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 参考:https://www.cnblogs.com/rocomp/p/4781987.html

反射获取构造函数并使用

        
        //1.加载Class对象
        Class clazz = Class.forName("com.ref.test.Student");
        
        System.out.println("所有公有构造方法");
        java.lang.reflect.Constructor[] constructors=clazz.getConstructors();
        
        System.out.println("所有的构造方法(包括:私有、受保护、默认、公有)");
        constructors=clazz.getDeclaredConstructors();
        
        System.out.println("获取公有、无参的构造方法");
        java.lang.reflect.Constructor con= clazz.getConstructor();
        //获取某个公有的构造函数
       java.lang.reflect.Constructor  cons1=clazz.getConstructor(String.class);
       
       //获取某个构造函数
       java.lang.reflect.Constructor cons2=clazz.getDeclaredConstructor(String.class,Integer.class);

 反射获取字段并使用

        // 1.加载Class对象
        Class clazz = Class.forName("com.ref.test.Student");
        Object obj = clazz.getConstructor().newInstance();

        // 获取指定字段,但是只能获取公有的字段
        Field field1 = clazz.getField("name");
        field1.set(obj, "123");
        System.out.println(obj.toString());

        Field field2 = clazz.getDeclaredField("phoneNum"); // 获取指定名称的字段(在所有中查找)
        System.out.println(field2);   这里获取到私有字段在类外是不能进行任何操作赋值取值操作的
        System.out.println("*****************");  

        Field[] fields = clazz.getFields(); // 这里只能取到公有的字段
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("******************");
        Field[] fields2 = clazz.getDeclaredFields();// 这里可以取到所有的字段
        for (Field field : fields2) {
            System.out.println(field);
        }

 反射获取方法并调用

        // 1.加载Class对象
        Class clazz = Class.forName("com.ref.test.Student");
        Object obj = clazz.getConstructor().newInstance();
        
        Method method1=clazz.getMethod("show1", String.class);
        method1.invoke(obj, "123");
        
        Method method2=clazz.getDeclaredMethod("show2");
        method2.invoke(obj);
        
        //获取所有的成员方法,包括私有的(不包括继承的
        Method[] methods1=clazz.getDeclaredMethods();
    
        //获取所有的公有的方法,包括继承父类的公有方法
        Method[] methods2=clazz.getMethods();

  

原文地址:https://www.cnblogs.com/yanliang12138/p/10240338.html