Loading

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() {
		
	}
}
posted @ 2020-10-31 23:05  linzeliang  阅读(77)  评论(0)    收藏  举报