java反射

java反射……未整理完

前两天大师傅给面试,仿佛接受洗礼一般。

学习java底层是很重要的,要把自己的知识点稳固一下。

感谢dkk师傅,送我的java安全学习连接。

在这也分享给大家:https://javasec.org/javase/Reflection/Reflection.html

java反射机制简介

Java反射(Reflection)是Java非常重要的动态特性,

通过使用反射我们可以:

  1. 获取到任何类的成员方法(Methods)、成员变量(Fields)、构造方法(Constructors)等信息,此处强调所有权限修饰都可得到。

  2. 还可以动态创建Java类实例、调用任意的类方法、修改任意的类成员变量值等。

Java反射机制是Java语言的动态性的重要体现,也是Java的各种框架底层实现的灵魂。

​ 参考:https://javasec.org/javase/Reflection/Reflection.html

学习时建立的一个简要的目录结构

可参考下图:

image-20200506143536068

获取Class(类)对象的三种方法

先把Person.java写好

Person.java

package com.human;

public class Person {

    public String a;

    protected String b;

    private String name;
    private  int age;

    String c;

    public Person(){
    }

    public Person(String name ,int age){
        this.name = name;
        this.age = age;
    }

    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public void eat(){
        System.out.println("eat……nothing");
    }
    public void eat(String food){
        System.out.println("eat……"+food);
    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", a='" + a + '\'' +
                ", b='" + b + '\'' +
                ", c='" + c + '\'' +
                '}';
    }
}

ReflectDemo1.java

package com.reflect;
import com.human.Person;
public class ReflectDemo1 {
    public static void main(String[] args) throws Exception{
        /*
            1. class.forName获取类对象
         */
        Class cls1 = Class.forName("com.human.Person");
        System.out.println(cls1);

        /*
            2. 类名.class获取类对象
        */
        Class cls2 = Person.class;
        System.out.println(cls2);

        /*
            3. getClass方法获取类对象
        */
        Person p = new Person();
        Class cls3 = p.getClass();
        System.out.println(cls3);

        /*根据上述的三个输出,我们知道了三种的到类对象的函数*/

        /*
            根据等于号的传递性,我们现在可以明确:
                class这个字节码文件,再一次程序中的只加载一次,
                这也是为什么三个cls都相同的原因。
        */
        System.out.println(cls1==cls2);
        System.out.println(cls2==cls3);
    }
}
posted @ 2020-05-06 19:06  何止(h3zh1)  阅读(135)  评论(0编辑  收藏  举报