反射介绍

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

Java反射机制,可以实现以下功能
①在运行时判断任意一个对象所属的类。
②在运行时构造任意一个类的对象。
③在运行时判断任意一个类所具有的成员变量和方法。
④在运行时调用任意一个对象的方法。
⑤生成动态代理。

获取源头Class

所有类的对象其实都是Class的实例。 这个Class实例可以理解为类的模子,就是包含了类的结构信息,类似于图纸。

获取Class对象(三种方式)

①Class.forName(”包名.类名”) (推荐使用)
②类.class
③对象.getClass()
例:

public class ReflectTest002 {
    public static void main(String[] args) {
        ReflectTest002 f=new ReflectTest002();
        //通过对象获取包名、类名
        Class<?> cls = f.getClass();
        System.out.println(cls.getName());
        //com.shsxt.refulect.ReflectTest002
        
        //通过类获取类名、类名
        Class<?> cls1 =ReflectTest002.class;
        System.out.println(cls1.getName());
        //com.shsxt.refulect.ReflectTest002
		
		//可以不用通过new对象来获取
		//通过Class.forName(包名.类名)方法获取包名、类名
        Class<?> cls2=Class.forName("com.shsxt.refulect.ReflectTest002");
        System.out.println(cls2.getName());
        //com.shsxt.refulect.ReflectTest002
    }
}

获取修饰符

public class ReflectTest002 {
    public static void main(String[] args) {
       //通过Class.forName(包名.类名)方法获取包名、类名
        Class<?> cls2=Class.forName("com.shsxt.refulect.ReflectTest002");
        System.out.println(cls2.getName());
        //com.shsxt.refulect.ReflectTest002
        //通过getModifiers()方法获取权限修饰符(int 类型)
        int m = cls2.getModifiers();
        System.out.println(m);//1
        //通过Modifier.toString(int类型权限修饰符)方法转为字符串类型
        String str=Modifier.toString(m);
        System.out.println(str);//public
    }
}

创建对象

获取构造器

setAccessible(true) 打开私有内容的权限
例:
Reflect001类

public class Reflect001 {
    private String name;
    private int age;

    public Reflect001() {
    }

    private Reflect001(String name) {
        this.name = name;
    }

    public Reflect001(int age) {
        this.age = age;
    }
    public void add(){
        System.out.println("敲代码");
    }
    public void fun(){
        System.out.println("不停的敲代码");
    }
}

测试 Reflect001类

public class ReflectTest003 {
    public static void main(String[] args) throws Exception {
        Class<?> cls=Class.forName("com.shsxt.refulect.Reflect001");
        //获取所有的public权限的构造器
        Constructor<?>[] con=cls.getConstructors();
        //遍历获取的构造器数组
        for (Constructor<?> con1:con)
        System.out.println(con1);
        System.out.println("===============================");
        //获取所有的构造器
        con=cls.getDeclaredConstructors();
        for (Constructor<?> con2 : con) {
            System.out.println(con2);
        }
        System.out.println("===============================");
        //获取指定的构造器
        Constructor<?> cos=cls.getConstructor(int.class);
        System.out.println(cos.getName());
        System.out.println("===============================");
        //获取非公开权限的构造器
        cos=cls.getDeclaredConstructor(String.class);
        System.out.println(cos.getName());
    }
}

实例化对象(重点)

创建对象的方式,有new 、克隆、反序列化,再加一种,根据Class对象,使用newInstance()创建此Class对象所表示的类的一个新实例 或者构造器实例化对象。
例:
Reflect001类

public class Reflect001 {
    private String name;
    private int age;

    public Reflect001() {
    }

    private Reflect001(String name) {
        this.name = name;
    }

    public Reflect001(int age) {
        this.age = age;
    }
    public void add(){
        System.out.println("敲代码");
    }
    public void fun(){
        System.out.println("不停的敲代码");
    }
}

测试 Reflect001类

public class ReflectTest004 {
    public static void main(String[] args) throws Exception {
        //通过newInstance实例化对象,获取空构造函数(方法)
        //获取源头
        Class<?> cls = Class.forName("com.shsxt.refulect.Reflect001");
        //通过newInstance创建对象   调用空构造
        Reflect001 reflect002 = (Reflect001) cls.newInstance();
        //调用Reflect001源头中的方法
        reflect002.add();//敲代码
        reflect002.fun();//不停的敲代码
        System.out.println("=================");
        //通过getDeclaredConstructors()创建对象,获取全部的构造函数(方法)
        Constructor<?>[] cls1=cls.getDeclaredConstructors();
        //遍历获取到的构造函数数组
        for (Constructor<?> con : cls1) {
            System.out.println(con);
            /*  public com.shsxt.refulect.Reflect001(int)
                private com.shsxt.refulect.Reflect001(java.lang.String)
                public com.shsxt.refulect.Reflect001()
             */
        }
    }
}

注意:newInstance()是调用空构造,如果空构造不存在,会出现异常

父类与接口

例:

public class ReflectTest005 {
    public static void main(String[] args) throws Exception{
    Class<?> cls=Class.forName("com.shsxt.refulect.Son");
        //获取父类
        Class superCls=cls.getSuperclass();
        System.out.println(superCls);
        //获取接口
        Class[] interCls=cls.getInterfaces();
        //打印数组长度
        System.out.println(interCls.length);
        //遍历数组
        for (Class inter : interCls) {
            System.out.println(inter);
        }
    }
}
class Father{
    public String name;
}
interface FatherIn1{
    void son();
}
interface FatherIn12{
    void fun();
}
class Son extends Father implements FatherIn1,FatherIn12{
    private  int age;
    private Integer name;
    @Override
    public void son() {
        System.out.println("一直敲代码");
    }

    @Override
    public void fun() {
        System.out.println("活动、活动");
    }
}

属性和方法

属性

例:

public class ReflectTest006 {
    public static void main(String[] args) throws Exception{
        Class<?> cls=Class.forName("com.shsxt.refulect.Son");
        //获取属性
        System.out.println("==============本类属性==============");
        //获取本类的全部属性
        Field[] field=cls.getDeclaredFields();
        //遍历数组
        for (Field getFie : field) {
            //获取权限修饰符(int 类型)
            int con=getFie.getModifiers();
            //int类型修饰符转String类型
            String str= Modifier.toString(con);
            System.out.println(str);//private private
            //获取属性类型
            Class<?> type=getFie.getType();
            //获取属性名
            String name=getFie.getName();
            System.out.println(str + " " + type + " " + name);
        }
        System.out.println("======公开的属性包括接口或者父类属性======");
        Field[] field1=cls.getFields();
        for (Field name1 : field1) {
            System.out.println(name1);
        }
    }
}

方法

例:

public class ReflectTest007 {
    public static void main(String[] args) throws Exception{
        Class<?> cls = Class.forName("com.shsxt.refulect.Son");
        System.out.println("============本类方法============");
        //取得全部公共方法
        Method[] methodCls=cls.getMethods();
        //遍历数组
        for (Method name : methodCls) {
            System.out.println(name);
            //获取方法权限(int 类型)
            int getMod = name.getModifiers();
            //int类型权限转String类型
            String con= Modifier.toString(getMod);
            System.out.println(con);
            //获取返回类型
            Class<?> type=name.getReturnType();
            System.out.println(type);
            //获取名字
            String clsName=name.getName();
            System.out.println(clsName);
            //获取参数
            Class<?>[] pare=name.getParameterTypes();
            for (int i = 0; i < pare.length; i++) {
                Class<?> p=pare[i];
                System.out.println(p);
            }
        }
    }
}

数组

例:

public class ReflectTest008 {
    public static void main(String[] args) {
        //创建数组
        Object obj= Array.newInstance(int.class,5);
        //获取大小
        if (obj.getClass().isArray()) {//判断是否为数组
            System.out.println("数组长度:"+Array.getLength(obj));
            //数组长度:5
            //设置值
            Array.set(obj, 1,11);
            //获取值
            System.out.println(Array.get(obj, 1));//11
            //Object强转int类型
            int[] arr1=(int[]) obj;
            for (int arr : arr1) {
                System.out.println(arr);//0 11 0 0 0
            }
        }
    }
}