美文网首页
反射机制

反射机制

作者: 蓬莱辰 | 来源:发表于2018-11-03 07:41 被阅读0次

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

    1.获取class对象的三种方式:

    类名.class;
    对象.getClass();
    Class.forName(类全名);ClassNotFoundException

    2.获取构造函数对象

    clazz.getConstructor();无参构造器
    clazz.getConstructor(参数类型的class对象);带参构造,参数类型

    Constructor constructor0 = clazz.getConstructor();// public class01.Person()
    Constructor constructor1 = clazz.getConstructor(String.class);// public class01.Person(java.lang.String)
    /**getConstructor(String.class,Integer.class)会抛出异常java.lang.NoSuchMethodException*/
    Constructor<Person> constructor2 = clazz.getConstructor(String.class,int.class);//public class01.Person(java.lang.String,int)
    System.out.println(constructor0);
    System.out.println(constructor1);
    System.out.println(constructor2);
    Person person0 = (Person) constructor0.newInstance();
    Person person1 = (Person) constructor1.newInstance("虚竹");
    System.out.println(person1.getName());// 虚竹
    

    3.获取属性

    clazz.getField(属性名称);不能获取私有属性,否则会抛出异常NoSuchFieldException
    clazz.getDeclaredField()获取私有属性
    filed.setAccessible(true);设置私有属性可见

    import java.lang.reflect.Field;
    public class Reflect {
        public static void main(String[] args) {
            Class clazz = Person.class;
            try {
                Person person = (Person) clazz.newInstance();
                System.out.println(clazz);// class class01.Person
                Field field = clazz.getDeclaredField("name");
                field.setAccessible(true);
                System.out.println(field);// private java.lang.String class01.Person.name
                field.set(person, "萧峰");
                Object name = field.get(person);// 萧峰
                System.out.println(name);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    3.获取方法

    异常:java.lang.NoSuchMethodException
    getDeclaredMethod();获取私有方法

    Method method0 = clazz.getMethod("fight", null);
    Method method1 = clazz.getMethod("fight", String.class);
    method0.invoke(person);// 左右勾拳
    method1.invoke(person, "萧峰");//萧峰:降龙十八掌之亢龙有悔
    
    public class Person {
        private String name;
        private int age;
    
        public Person() {
        }
    
        public Person(String name) {
            this.name = name;
        }
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
            public void fight() {
            System.out.println("左右勾拳");
        }
        public void fight(String name) {
            System.out.println(name+":降龙十八掌之亢龙有悔");
        }
    }
    

    https://blog.csdn.net/codejas/article/details/78635926

    相关文章

      网友评论

          本文标题:反射机制

          本文链接:https://www.haomeiwen.com/subject/zcohxqtx.html