JAVA动态性——反射机制(二:通过反射获取类、操作类的信息)

kcoufee
发布于 2020-9-18 13:48
浏览
0收藏

自定义javabean类代码

 

package first.reflect;

 

public class Bean {

    private int age;

    private String name;

    private int id;

 

    public Bean() {

 

    }

 

    public Bean(int age, String name, int id) {

        this.age = age;

        this.name = name;

        this.id = id;

    }

 

    public int getAge() {

        return age;

    }

 

    public void setAge(int age) {

        this.age = age;

    }

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

 

    public int getId() {

        return id;

    }

 

    public void setId(int id) {

        this.id = id;

    }

}

 

 通过反射获取类的三种方式:

 

JAVA动态性——反射机制(二:通过反射获取类、操作类的信息)-鸿蒙开发者社区

package first.reflect;

 

public class test {

    public static void main(String[] args) throws ClassNotFoundException {

        String path = "first.reflect.Bean";

 

//方式一,最常用的方式,通过Class类的静态方法forname(字符串的类名)获取

        Class c1 = Class.forName(path);

        System.out.println(c1);

 

        Class<Bean> c2 = (Class<Bean>) Class.forName(path);

        System.out.println(c2);

        System.out.println(c1 == c2);//true

 

//方式二,通过类名获取,包括所有类型(基本数据类型和引用数据类型)

        Class c3 = String.class;

        System.out.println(c3);

 

        Class c4 = int.class;

        System.out.println(c4);

 

//方式三,通过类对象的getClass()方法获取

Bean bean=new Bean();

        Class c5 = bean.getClass();

        System.out.println(c5);

 

        //维数和类型相同数组的类对象相同

        int[] arr01 = new int[10];

        int[][] arr02 = new int[30][3];

        int[] arr03 = new int[30];

        double[] arr04 = new double[10];

        System.out.println(arr01.getClass().hashCode());

        System.out.println(arr02.getClass().hashCode());

        System.out.println(arr03.getClass().hashCode());

        System.out.println(arr04.getClass().hashCode());

    }

}

 

通过反射获取类的信息 :

 

package first.reflect;

 

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

 

public class test02 {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {

        String path = "first.reflect.Bean";

        //获取类

        Class c = Class.forName(path);

 

        //获取类的名字

        System.out.println(c.getName());//包名+类名

        System.out.println(c.getSimpleName());//类名

 

        //获取属性信息

        //获得某个类的所有的public的字段,包括父类中的字段。

        Field[] field = c.getFields();

        System.out.println(field.length);

        //获得某个类的所有声明的字段,即包括public、private和protected,但是不包括父类的申明字段。

        Field[] fields = c.getDeclaredFields();

        for (Field f : fields)

            System.out.println(f);

 

        //获取方法信息

        //获取本类以及父类或者父接口中所有的公共方法

        Method[] method = c.getMethods();

        System.out.println(method.length);

        for (Method m : method)

            System.out.println(m);

        //获取本类中的所有方法,包括私有的(private、protected、默认以及public)的方法。

        Method[] methods = c.getDeclaredMethods();

        System.out.println(methods.length);

        for (Method m : methods)

            System.out.println(m);

        //获取指定方法,第一个参数为方法名,第二个参数为参数类型,没有参数即null

        Method m1 = c.getDeclaredMethod("getName", null);

        Method m2 = c.getDeclaredMethod("setName", String.class);

 

        //获取构造器信息

        //返回指定参数类型访问权限是public的构造器

        Constructor[] constructor = c.getConstructors();

        System.out.println(constructor.length);

        //返回指定参数类型的所有构造器,包括public的和非public的,当然也包括private的

        Constructor[] constructors = c.getConstructors();

        for (Constructor con : constructors)

            System.out.println(con);

        //获取指定构造器,参数为参数类型的类对象,无参则为null

        Constructor constructor1 = c.getConstructor(null);

        System.out.println(constructor1);

        Constructor constructor2 = c.getConstructor(int.class, String.class, int.class);

        System.out.println(constructor2);

    }

}

 

通过反射操作类的信息 

 

JAVA动态性——反射机制(二:通过反射获取类、操作类的信息)-鸿蒙开发者社区

package first.reflect;

 

import java.lang.reflect.Field;

import java.lang.reflect.Method;

 

public class test03 {

    public static void main(String[] args) throws Exception {

        String path = "first.reflect.Bean";

 

        //获取类

        Class<Bean> c = (Class<Bean>) Class.forName(path);

 

        //通过反射API调用无参构造方法

        Bean bean = c.getDeclaredConstructor().newInstance();

        System.out.println(bean);

        //通过反射API调用有参构造方法

        Bean bean1 = c.getDeclaredConstructor(int.class, String.class, int.class).newInstance(20, "zsr", 2018217876);

        System.out.println(bean1);

        System.out.println(bean1.getAge() + " " + bean1.getName() + " " + bean1.getId());

 

        //通过反射API调用普通方法

        Bean bean2 = c.getDeclaredConstructor().newInstance();

        Method method = c.getDeclaredMethod("setName", String.class);

        method.invoke(bean2, "gcc");

        System.out.println(bean2.getName());

 

        //通过反射API操作属性

        Bean bean3 = c.getDeclaredConstructor().newInstance();

        Field field = c.getDeclaredField("name");

        field.setAccessible(true);//这个属性不需要做安全检查了,可以直接访问

        field.set(bean3, "zsr");//通过反射直接写属性

        System.out.println(bean3.getName()); //通过反射直接读属性的值

        System.out.println(field.get(bean3));

    }

}

分类
已于2020-9-18 13:48:01修改
收藏
回复
举报
回复
    相关推荐