反射

作者: 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参数

相关文章

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

  • 镜面反射矩阵的推导

    镜面反射是以镜面作为反射平面,实物与反射物到反射平面的距离相等,实物与反射物方向相反,所以,反射矩阵由反射平面确定...

  • reflect.go包学习_之二 指针操作提高反射性能 反射应用

    reflect.go包学习_之二 指针操作提高反射性能 反射应用 反射创建实例 反射信息、反射调用方法、反射修改值...

  • Java互联网公司-经典面试题附答案

    基础:Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?优点:反射具有解耦性,缺点:反射属...

  • Java反射与joor反射库的使用

    java原生反射的使用 反射构造对象 反射方法 反射字段 joor反射库的使用 github:https://gi...

  • Java反射

    什么是反射? 反射的作用? 反射性能优化?

  • 反射三定律

    反射第一定律:反射可以将interface类型变量转换成反射对象 反射第二定律:反射可以将反射对象还原成inter...

  • 反射

    1.反射是什么?反射的定义,概念 2.为什么要学反射? 3.怎么使用反射?反射的使用

  • 一周岁前做好两件事,孩子就不会语言迟缓,保证口齿伶俐

    与语言发展相关的原始反射有四个:张口反射、足跖反射、抓握反射和手拉反射,每个反射的发生、发展和整合都是次第进行的,...

  • 面试官问go反射第一弹

    目录 反射概念 reflect包 反射类型(Type)和种类(Kind) 反射类型(Type)使用 反射类型对象(...

网友评论

    本文标题:反射

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