将类的各个组成部分封装为其他对象, 称为反射机制
反射是框架设计的灵魂
优点:
每加载一种 class,JVM就为其创建一个 Class 类型的实例,并关联起来。注意:这里的 Class 类型是一个名叫 Class 的 class。它长这样:
public final class Class { private Class() {} }
获取一个 class 的 反射对象(Class 实例), 有三种方法:
1) Class.forName(全类名)
多用于配置文件, 读取文件, 加载类
2) 类名.Class
3) 对象.getClass(): 在 Object 类中定义
同一个字节码文件(.class) 在程序里只被加载一次, 不论通过哪一种方式获取都是同一个
demo:
package com.company; public class Main { public static void main(String[] args) throws ClassNotFoundException { // forName() Class cls1 = Class.forName("com.company.Person"); System.out.println(cls1); // .class System.out.println(Person.class); // .getClass() System.out.println(new Person().getClass()); } } class Person { private String name; public void Person(String naem) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
获取成员变量
Field[] getFields(): 获取所有 public 修饰的成员变量
Field getField(String name)
Field[] getDeclaredFields(): 获取所有的成员变量 (不考虑修饰符)
Field getDeclaredField(String name)
获取构造方法
Constructor<?>[] getConstructors()
Constructor<T> getConstructor(Class<?>... parameterTypes)
Constructor<?>[] getDeclaredConstructor()
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
获取成员方法
Method[] getMethods()
Method getMethod(String name, Class<T>... parameterTypes)
Method[] getDeclaredMethods()
Method[] getDeclaredMethods(String name, Class<T>... parameterTypes)
获取类名, 方法名
String getName()
: 获取所有的成员变量 (不考虑修饰符)
Field getDeclaredField(String name)
Field 对象操作成员变量:
ending ~
原文:https://www.cnblogs.com/kaichenkai/p/11822207.html