Java反射复习笔记
目录
反射
获取反射的三种方式:
Class.forName(全类名):将字节码文件加载进内存,返回Class对象,全类名要加上类的包名,例top.linzeliang.example.RelfectTest(多用于配置文件,将类名定义在配置文件中,先读取文件,获取文件名,然后加载类)类名.class:通过类名的属性class获取(多用于参数传递)对象.getClass():用于对象获取字节码的方式
Class对象的功能
获取 成员变量/成员变量们
Field[] getFields():获取所有public修饰符修饰的变量,包括从父类继承来的字段,即protected、default、private无法被获取Field getField(String name):获取指定变量名称的public修饰符修饰的变量Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符(只要是成员变量就可以被获取)Filed getDeclaredField(String name):可以获取本类所有的字段,包括private的,但是不能获取继承来的字段。 ( 这里只能获取到private的字段,但并不能访问该private字段的值,除非加上setAccessible(true))
获取 成员方法/成员方法们
Method[] getMethods()Mathod getMethod(String name, 类<?>... parameterTypes)Method[] getDeclaredMethods()Method getDeclaredMethod(String name, 类<?>... parameterTypes)
获取构造方法们
Constructor<?>[] getConstructors()Constructor<T> getConstructor(类<?>... parameterTypes)Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)Constructor<?>[] getDeclaredConstructors()
获取全类名
String getName()
Field:成员变量
void set(Object obj, Object value):设置值get(Object obj):获取值setAccessible(true):忽略访问权限修饰符的安全检查,即暴力反射
Method:成员方法
invoke(Object obj, Object args):执行方法String getName():获取方法名
Constructor:构造方法
newInstance(Object... initargs):创建对象- 如果使用空参构造器创建对象,则可以直接
Class对象.newInstance()
通过框架创建对象
public class Demo {
public static void main(String[] args) throws Exception {
//加载配置文件,配置文件路径要在src目录下
Properties pro = new Properties();
InputStream is = Demo.class.getClassLoader().getResourceAsStream("pro.properties");
pro.load(is);
//获取配置文件中的数据
String className = pro.getProperty("className");
//通过全类名将该类加载进入内存
Class c = Class.forName(className);
//创建对象
Object obj = c.newInstance();
System.out.println(obj);
}
}
public class ReflectTest {
public int a = 1;
protected int b = 2;
int c = 3;
private int d = 4;
public void m1() {
System.out.println("miaoa");
}
protected void m2() {
}
void m3() {
}
private void m4() {
}
}
我走得很慢,但我从不后退!

浙公网安备 33010602011771号