java反射

获取Class对象的三种方式

1.对象的getClass方法

2.类的class属性

3.class.forName("类的路径")方法

ReflectDemo demo  = new ReflectDemo();
        Class ReflectClass = demo.getClass();
        System.out.println(ReflectClass.getName());
        Class ReflectClass2 = ReflectDemo.class;
        System.out.println(ReflectClass2.getName());
        System.out.println(ReflectClass2 == ReflectClass);
        Class ReflectClass3 = null;
        try {
            ReflectClass3 = Class.forName("reflect.ReflectDemo");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println(ReflectClass == ReflectClass3);

获取构造函数

Class<?> reflect = Class.forName("reflect.ReflectConstructor");
        Constructor[] array = reflect.getConstructors(); //获取所有非私有构造函数
        for (Constructor c : array){
            System.out.println(c);
        }
        System.out.println("-----------");
        Constructor[] array2 = reflect.getDeclaredConstructors();//获取所有构造函数(包括私有构造)
        for (Constructor c : array2){
            System.out.println(c);
        }
        System.out.println("-------------");
        Constructor<?> constructor = reflect.getConstructor(String.class);//获取单个特定的非私有构造函数
        Constructor constructor1 = reflect.getDeclaredConstructor(int.class);
        //获取单个特定的构造函数
      ReflectConstructor reflectConstructor = (ReflectConstructor) constructor.newInstance("abc");
        constructor1.setAccessible(true);
        constructor1.newInstance(2);
    }

 获取属性

 ReflectField obj = new ReflectField();
        Class clazz = Class.forName("reflect.ReflectField");

        Field[] fields = clazz.getFields(); //获取所有非私有的属性
        for(Field field : fields){
            System.out.println(field);
        }
        System.out.println("-------------------");
        fields = clazz.getDeclaredFields();//获取所有属性(包括私有属性)
        for(Field field : fields){
            System.out.println(field);
        }

        Field field = clazz.getField("info");//根据属性名获取特定的非私有属性
        field.set(obj,"张三");

        field = clazz.getDeclaredField("str");//根据属性名获取特定的所有属性
        field.setAccessible(true);
        field.set(obj,"李四");

        System.out.println(obj);

获取方法

public static void main(String[] args) throws Exception {
        ReflectMethod obj = new ReflectMethod();
        Class clazz = Class.forName("reflect.ReflectMethod");
        Method[] methods = clazz.getMethods();//获取所有非私有方法,包括继承自父类的方法
        for(Method m : methods){
            System.out.println(m);
        }
        System.out.println("-------------");
        methods = clazz.getDeclaredMethods();//获取所有的方法
        for(Method m : methods){
            System.out.println(m);
        }
        System.out.println("------------");

        Method method = clazz.getMethod("method", String.class, String.class);
        method.invoke(obj,"work","succ");
        System.out.println("---------");
        method = clazz.getDeclaredMethod("method", String.class);
        method.setAccessible(true);
        method.invoke(obj,"ibetter");
    }
原文地址:https://www.cnblogs.com/lzh66/p/13520805.html