反射

框架设计的灵魂
框架:半成品软件。可以在框架的基础上进行软件开发,简化编码。

什么是反射:将类的各个组成部分封装称其他对象

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

反射类:Person.class

public class Person {
    private String name;
    private int age;

    public String a;
    protected String b;
    String c;
    private String d;

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

    public Person() {
    }

    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;
    }

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

    private void eat(String str){
        System.out.println("eat....."+str);
    }
}

获取Class对象的方式

1.Class.forName("全类名"):将字节码文件加载到内存
#多用于配制文件,将类名定义在配制文件中。读取文件,加载类
2.类名.class:通过类名的属性.class获取
#多用于参数的传递
3.对象.getClass():getClass在Object类中定义
#多用于对象获取字节码

    Class personClass1 = Person.class;
    Class personClass2 = Class.forName("cn.test.Person");
    Class personClass3 = (new Person()).getClass();
    System.out.println(personClass1);
    System.out.println(personClass2);
    System.out.println(personClass3);

    System.out.println(personClass1 == personClass2);
    System.out.println(personClass1 == personClass3);

personClass1 == personClass2 == personClass3
结论:同一个字节码文件(.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取

Class对象的功能

1.获取成员变量
getFields: 获取public成员变量
getDeclaredFields:获取所有成员变量
getField(String name):获取public具体的成员变量
getDeclaredField(String name):获取具体的成员变量
获取field值,设置field值

    Class personClass = Person.class;
    Object personClassInstance = personClass.newInstance();//创建实例对象

    Field name = personClass.getDeclaredField("name");
    name.setAccessible(true); //暴力反色号
    Object o = name.get(personClassInstance);//获取值
    System.out.println(o);

    name.set(personClassInstance,"zhang");//设置值
    Object o1 = name.get(personClassInstance);
    System.out.println(o1);

2.获取构造方法
getConstructors()
getConstructor(Class<?>... parameterTypes)//不带Declared是获取public修饰的构造方法
getDeclaredConstructors()
getDeclaredConstructor(Class<?>... parameterTypes) 参数

    //获取构造方法
    Constructor[] constructors = personClass.getDeclaredConstructors();
    for (Constructor constructor : constructors) {
        System.out.println(constructor);
    }

    Constructor declaredConstructor = personClass.getDeclaredConstructor(String.class, int.class);
    declaredConstructor.setAccessible(true);
    Object zhangj = declaredConstructor.newInstance("zhangj", 30);
    System.out.println(zhangj);

3.获取成员方法
getMethods()
getMethod(String name, Class<?>... parameterTypes)
getDeclaredMethods()
getDeclaredMethod(String name, Class<?>... parameterTypes)//name:方法名;parameterTypes:参数列表

class Person {
    private void eat(String str){
        System.out.println("eat....."+str);
    }
}
    //获取成员方法
    Method[] methods = personClass.getDeclaredMethods();
    for (Method method : methods) {
        System.out.println(method);
    }
    Method eatMethod = personClass.getDeclaredMethod("eat", String.class);
    eatMethod.setAccessible(true);
    eatMethod.invoke(personClassInstance,"面");

4.获取类名

    personClass.getName();
    personClass.getPackage().getName();
    personClassInstance.getClass().getName();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 反射是框架设计的灵魂 软件框架:软件本成品,能够帮助我们提高开发效率。Spring,SpringMVC,Mybat...
    六艺str阅读 1,696评论 0 0
  • 1.1 框架的概念 ​ 半成品软件。可以在框架的基础上进行软件开发,简化编码。学习框架并不需要了解反射,但是要...
    AaFaa阅读 1,937评论 0 0
  • 前言(来自文章https://blog.csdn.net/qq_44543508/article/details/...
    杜艳_66c4阅读 1,501评论 0 0
  • 反射机制 由于需要通过外部文件配置,在不修改源码情况下,来控制程序,是符合设计模式的ocp原则(开闭原则) 反射机...
    笑火云天阅读 1,118评论 0 0
  • 反射 框架设计的灵魂 Java中的反射顾名思义就是将类的各个组成部分封装为其他对象。使用这些封装后的对象可以进行一...
    So_ProbuING阅读 2,548评论 2 0