反射基本介绍及用法

一.什么是反射

反射机制是在运行状态中,对于任何一个类,都知道它的属性和方法,对于任何一个对象,都知道它的方法和属性

二.反射的好处

1.在运行中判断任意一个对对象所属的类
2.在运行中构造任意一个类的对象
3.在运行中判断任意一个类所具有的成员变量和方法
4.在运行中调用任意一个对象的方法
5.动态代理

三.怎么使用

反射包都在reflect包中
有三种方式获取反射对象
一.获取反射对象
1.Class.forName(全类名)–一般用这个
2.类名.Class
3.对象.getClass()方法

public static void main(String[] args) throws ClassNotFoundException {
        //Class.forName(全类名)
        Class perClazz=Class.forName("com.crc.test.person");
        System.out.println(perClazz);
        //类名.Class
        Class perClazz1=person.class;
        System.out.println(perClazz1);
        //对象.getClass()方法
        person per=new person();
        Class perClazz3=per.getClass();
        System.out.println(perClazz3);
    }

打印结果
class com.crc.test.person
class com.crc.test.person
class com.crc.test.person
二.获取方法
perClazz.getDeclaredMethods();获取本类所有方法(包括私有)
perClazz.getMethods();获取所有公共方法(1本类,父类,接口。2非私有)

public static void main(String[] args) throws ClassNotFoundException {
        //Class入口
        Class perClazz=Class.forName("com.crc.test.person");
        System.out.println(perClazz);
        //获取方法
        Method[] method=perClazz.getDeclaredMethods();
        for (Method method2 : method) {
            System.out.println(method2);
        }

    }

三.获取接口
perClazz.getInterfaces();

public static void main(String[] args) throws ClassNotFoundException {
        //Class入口
        Class perClazz=Class.forName("com.crc.test.person");
        //获取接口
        Class[] method=perClazz.getInterfaces();
        for (Class method2 : method) {
            System.out.println(method2);
        }

    }

四.获取父类
perClazz.getSuperclass();

public static void main(String[] args) throws ClassNotFoundException {
        //Class入口
        Class perClazz=Class.forName("com.crc.test.person");
        //获取父类
        Class method=perClazz.getSuperclass();
        System.out.println(method);

    }

五.获取构造方法
perClazz.getConstructors();获取多个
perClazz.getConstructor();获取单个(有参根据传入的是什么类型找对应的构造函数

public static void main(String[] args) throws ClassNotFoundException {
        //Class入口
        Class perClazz=Class.forName("com.crc.test.person");
        //获取构造方法
        Constructor[] method=perClazz.getConstructors();
        for (Constructor method2 : method) {
            System.out.println(method2);
        }

    }

Constructor constructor=perClazz.getConstructor(int.class);有参根据传入的是什么类型找对应的构造函数

public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
        //Class入口
        Class perClazz=Class.forName("com.crc.test.person");
        Constructor constructor=perClazz.getConstructor(int.class);
        //修改private的访问权限
        person per =(person) constructor.newInstance(1);
        System.out.println(constructor);

    }

打印结果
public com.crc.test.person(int)
六.获取所有的属性
perClazz.getDeclaredFields();获取本类所有属性(包括私有)
perClazz.getFields();获取所有公共属性(1本类,父类,接口。2非私有)

public static void main(String[] args) throws ClassNotFoundException {
        //Class入口
        Class perClazz=Class.forName("com.crc.test.person");
        //获取所有公有属性
        Field[] file=perClazz.getFields();
        for (Field file2 : file) {
            System.out.println(file2);
        }

    }

七.获取当前反射所代表类对象
perClazz.newInstance();

public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        //Class入口
        Class perClazz=Class.forName("com.crc.test.person");
        //获取所代表对象
        Object Obj=perClazz.newInstance();
        person per=(person) Obj;
        per.intefaceMethod();
    }

八.操作属性
下面这段代码操作age
file.set(per,2);

public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException {
        //Class入口
        Class perClazz=Class.forName("com.crc.test.person");
        //获取所代表对象
        Object Obj=perClazz.newInstance();
        person per=(person) Obj;
        Field file=perClazz.getDeclaredField("age");
        //修改private的访问权限
        file.setAccessible(true);
        file.set(per,2);//类似于setAge(),区别是访问private要加上setAccessible
        System.out.println(per.getAge());

    }

九.操作方法
method.invoke(per,null);,和操作属性类似

public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
        //Class入口
        Class perClazz=Class.forName("com.crc.test.person");
        //获取所代表对象
        Object Obj=perClazz.newInstance();
        person per=(person) Obj;
        Method method=perClazz.getDeclaredMethod("intefaceMethod2");
        //修改private的访问权限
        method.setAccessible(true);
        method.invoke(per,null);
    }

猜你喜欢

转载自blog.csdn.net/qq_29485643/article/details/81586614