Java 进阶知识 反射

概念

将类的各个组成部分封装为其他对象,这就是反射

java代码运行时,类加载器就会将进入内存的类的3个部分封装成对象

反射的好处:1.可以在程序运行过程中操作这些对象。
2.可以解耦,提高程序扩展性。

获取Class类对象的方式

1.Class.forName("全类名")//将字节码文件加载进内存,返回Class对象
2 类名.class //通过类名.class 来获取
3 对象.getClass()方法
3种方式获取的Class对象相同(其实是因为Class对象就是唯一对应的)

package domain;

public class Person {
    private String name;
    private int age;
    public Person() {
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = 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;
    }
}
package reflect;

import domain.Person;

public class ReflectDemo1  {
    /*
    1.Class.forName("全类名")//将字节码文件加载进内存,返回Class对象
    2 类名.class //通过类名.class 来获取
    3 对象.getClass()方法
     */
    public static void main(String[] args) throws Exception {
        //1.Class.forName("全类名")//将字节码文件加载进内存,返回Class对象
        Class Cls1 = Class.forName("domain.Person");
        System.out.println(Cls1);
        //类名.class 
        Class Cls2 = Person.class;
        System.out.println(Cls2);
        //对象.getClass()方法
        Person person=new Person();
        Class Cls3 = person.getClass();
        System.out.println(Cls3);
    }
}

Class对象功能

获取功能

1.获取成员变量们()

Field[] getFields()//获取所有public的成员变量
Field getField(String name)//获取指定的public的成员变量
Field[] getDeclaredFields()//获取所有的成员变量
Field getDeclaredField(String name)
package reflect;

import domain.Person;

import java.lang.reflect.Field;

public class ReflectDemo2  {
    public static void main(String[] args) throws Exception {
        Class personClass = Person.class;
        Field field = personClass.getDeclaredField("name");
        field.setAccessible(true);//强制访问 可以访问和设置private变量
        Person person=new Person("jie",20);
        System.out.println(field.get(person));
        field.set(person,"杰");
        System.out.println(person.getName());
    }
}

2.获取构造方法们()

Constructor<T> getConstructor(类<?>... parameterTypes) 
Constructor<?>[] getConstructors()  
Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)  
Constructor<?>[] getDeclaredConstructors()  
package reflect;

import domain.Person;

import java.lang.reflect.Constructor;


public class ReflectDemo2  {
    public static void main(String[] args) throws Exception {
        Class personClass = Person.class;
        //通过参数来确定要获取哪个构造函数
        Constructor constructor= personClass.getConstructor(String.class,int.class);
        //获取构造函数来创建对象
        Person person1 = (Person) constructor.newInstance("jie", 18);
        System.out.println(person1.getName());
        /*如果使用空参构造 可以使用personClass.newInstance();*/
    }
}

3.获取成员方法们()

Method getMethod(String name, 类<?>... parameterTypes)  
Method[] getMethods()  
Method getDeclaredMethod(String name, 类<?>... parameterTypes)  
Method[] getDeclaredMethods()  
package reflect;

import domain.Person;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;


public class ReflectDemo2  {
    public static void main(String[] args) throws Exception {
        Class personClass = Person.class;
        //获取指定名称的方法
        Method eat_method = personClass.getMethod("eat",String.class);
        Person person=new Person("jie",18);
        eat_method.invoke(person,"面条");
    }
}

4.获取类名

String getName()  
posted @ 2021-03-29 15:22  一个经常掉线的人  阅读(60)  评论(0)    收藏  举报