我爱编程

反射

2018-05-28  本文已影响20人  erki_stwee

反射概念

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参数
上一篇下一篇

猜你喜欢

热点阅读