反射

反射概念

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://blog.csdn.net/sinat_38259539/article/details/71...
    扎Zn了老Fe阅读 514评论 0 4
  • 整体Retrofit内容如下: 1、Retrofit解析1之前哨站——理解RESTful 2、Retrofit解析...
    隔壁老李头阅读 4,629评论 2 12
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,947评论 18 139
  • 今天公司组织活动6点多就出门了,可是临出门他醒了抱着我不让出门!安慰半天没结果,因为赶车就不得不走出去!听到...
    Applestar英语老师阅读 222评论 0 0
  • 3-9岁的女孩子幻想着自己是漂亮聪慧的公主,于是她们喜欢漂亮的裙子,喜欢粉红色;10岁以后的女生希望将来生活条件...
    沫简兮阅读 170评论 0 0