反射

1.什么是反射机制

JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制

2.反射的特点:动态性

3.通过反射调用成员变量及成员方法

public class Person {
    private String name;
    private int age;
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Person(String name, int age) {

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

    public Person() {
    }

    public void show()
    {
        System.out.println("HelloWorld");
    }

    private  void  shownation(String nation)
    {
        System.out.println("HelloWorld"+nation);
        //return nation;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
//相对应的包
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
//具体使用
 Class zz = Person.class;

        Person person = (Person) zz.newInstance();
        Field f1 = zz.getDeclaredField("name");
        f1.setAccessible(true);
        f1.set(person, "aaaa");
        
        //private私有属性获取
        Field f2 = zz.getDeclaredField("age");
        f2.setAccessible(true);
        f2.set(person, 20);

        //通过反射调用运行时类的指定方法
        Method m1 = zz.getMethod("show");
        m1.invoke(person);

        Method m2 = zz.getDeclaredMethod("shownation", String.class);
        //私有的需要设置可见性
        m2.setAccessible(true);
        m2.invoke(person, "Canada");

        //通过反射创建对象----利用构造函数
        Constructor cons = zz.getConstructor(String.class, int.class);
        Object obj = cons.newInstance("pikaqiu~", 3);
        Person o = (Person) obj;
        System.out.println(o.toString());

4.获取Class实例的方式

  //方式一:调用运行时类的属性  .class
        Class ss1=Person.class;
        System.out.println(ss1);

        //方式二:通过运行时类的对象,调用getClass()
        Person p1=new Person();
        Class ss2=p1.getClass();
        System.out.println(ss2);

        //方式三:调用Class的静态方法:forName(String classath)
        Class ss3=Class.forName("Person");
        System.out.println(ss3);

5.类的加载

 程序经过javac.exe命令以后,会生成一个或多个字 节码文件(.class结尾)。
 接着我们使用java. exe命令对某个字节码文件进行解释运行。相当于将某个字节码文件加载到内存中,此过程就称为类的加载

6.运行时类

加载到内存中的类,我们就称为运行时类,成为Class的一个实例

原文地址:https://www.cnblogs.com/ywqtro/p/12202776.html