反射

作者: erki_stwee | 来源:发表于2018-05-28 18:39 被阅读20次

    反射概念

    Java反射机制是指在运行状态中,对于任意一个类,都能知道这个类的属性和方法。这样动态获取新的以及动态调用对象方法的功能就叫做反射。

    如何使用反射

    A.使用Class类,获取出被解刨的这个类的class文件对象。
    B.使用Class类方法,获取出类中的所有成员。
    C.将成员获取出来后,交给对应类,对应类中的方法,运行成员。

    如何获取.class文件对象

    1.使用类的对象获取
    每个类都使用Object作为父类,Object类方法getClass()返回这个类的class文件对象,方法返回Class类型对象。
    2.使用类的静态属性获取
    类名.class返回这个类的class文件对象,属性运行结果也是Class类型对象。
    3.使用Class类的静态方法获取
    Class类静态方法forName(String 全类名)。

    public class Person {
    }
    
    public class Person1 {
    
        public String name = "smt";
        private String idcard = "10086";
    
        public Person1(){
            System.out.println("Person1类无参数构造器");
        }
    
        public Person1(int a,int b,String s){
            System.out.println("Person1类三参数构造器");
        }
    
        private Person1(int a){
            System.out.println("Person1类参数构造器");
        }
    
        @Override
        public String toString() {
            return "Person1{" +
                    "name='" + name + '\'' +
                    ", idcard='" + idcard + '\'' +
                    '}';
        }
    
        public void show(){
            System.out.println("show 空参数");
        }
    
        public void show(int a){
            System.out.println("show int参数");
        }
    
        public void show(String a){
            System.out.println("show String参数");
        }
    
    }
    
    public class TestReflection {
    
        public static void main(String [] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
            Person person = new Person();
            Class<? extends Person> personClass = person.getClass();
            System.out.println(personClass);
    
            Class<Person> aClass = Person.class;
            System.out.println(aClass);
    
            Class<?> forName = Class.forName("com.huawei.solar.reflect.Person");
            System.out.println(forName);
    
            System.out.println(forName == aClass);
            System.out.println(personClass == aClass);
    
    
            Class<?> person1 =  Class.forName("com.huawei.solar.reflect.Person1");
            Constructor<?>[] constructors =
                    person1.getConstructors();
            for (Constructor con : constructors){
                System.out.println(con);
            }
    
            Constructor<?> cc = person1.getConstructor();
            Object o = cc.newInstance();
    
            Constructor<?> cc1 = person1.getConstructor(int.class, int.class, String.class);
            Object haha = cc1.newInstance(1, 2, "haha");
    
            Constructor<?> cc2 = person1.getDeclaredConstructor(int.class);
            //取消封装
            cc2.setAccessible(true);
            Object o1 = cc2.newInstance(1);
    
            person1.newInstance();
            System.out.println("-------------------------------");
    
            Field[] fields = person1.getFields();
            for (Field field : fields){
                System.out.println(field);
            }
    
            Field name = person1.getField("name");
            name.set(o,"Uart");
            System.out.println(o);
    
            Field idcard = person1.getDeclaredField("idcard");
            idcard.setAccessible(true);
            idcard.set(o,"123456");
            System.out.println(o);
    
            System.out.println("-------------------------------");
            Method[] methods =
                    person1.getMethods();
            for (Method m : methods){
                System.out.println(m);
            }
            Method show = person1.getMethod("show");
            show.invoke(o);
    
            Method show1 = person1.getMethod("show", int.class);
            show1.invoke(o,1234);
    
            Method show2 = person1.getMethod("show", String.class);
            show2.setAccessible(true);
            show2.invoke(o,"Uart");
    
        }
    
    }
    
    
    class com.uart.solar.reflect.Person
     class com.uart.solar.reflect.Person
     class com.uart.solar.reflect.Person
     true
     true
     public com.uart.solar.reflect.Person1(int,int,java.lang.String)
     public com.uart.solar.reflect.Person1()
     Person1类无参数构造器
     Person1类三参数构造器
     Person1类参数构造器
     Person1类无参数构造器
     -------------------------------
     public java.lang.String com.uart.solar.reflect.Person1.name
     Person1{name='Uart', idcard='10086'}
     Person1{name='Uart', idcard='123456'}
     -------------------------------
     public java.lang.String com.uart.solar.reflect.Person1.toString()
     public void com.uart.solar.reflect.Person1.show()
     public void com.uart.solar.reflect.Person1.show(int)
     public void com.uart.solar.reflect.Person1.show(java.lang.String)
     public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
     public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
     public final void java.lang.Object.wait() throws java.lang.InterruptedException
     public boolean java.lang.Object.equals(java.lang.Object)
     public native int java.lang.Object.hashCode()
     public final native java.lang.Class java.lang.Object.getClass()
     public final native void java.lang.Object.notify()
     public final native void java.lang.Object.notifyAll()
     show 空参数
     show int参数
     show String参数
    

    相关文章

      网友评论

        本文标题:反射

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