Java学习笔记-反射机制

Java反射机制实在运行状态时,对于任意一个类,都能够知道这个类的属性和方法,对于任意一个对象,都能够调用他的任意一个属性和方法

获取Class对象的三种方式

  • Object类中的getClass()方法
    想要用这种方式,必须要明确具体的类,并创建对象
Person p = new Person();
Class clazz = p.getClass();
  • 任何数据类型都具备一个静态的属性.class来获取其对应的Class对象
    相对简单,但是还是要明确用到类中的静态成员
Class clazz = Person.class;
  • 通过给定的类的字符串名称就获取该类,该方法就是forName
String className = "com.abc.Person"; //此处为class的全称
Class clazz = Class.forName(className);

获取构造函数

  • 无参构造函数
String name = "com.abc.Person";
Class clazz = Class.forName(name);
Object obj  = clazz.newInstance();
  • 有参构造函数
    获取到该构造函数:getConstructor(paramterTypes);
String name = "com.abc.Person";
Class clazz = Class.forName(name);
Constructor constructor = clazz.getConstructor(String.class, int.class);
Object obj = constructor.newInstance("test", 10);

获取字段

公有

Class clazz = Class.forName("com.abc.Person");
Field field = clazz.getField("age"); //只能获取公有的
Object o = field.get(obj);
System.out.println(o);

私有

Class clazz = Class.forName("com.abc.Person");
Field field = clazz.getDeclaredField("age"); //只获取本类,但包含私有
//对私有字段的访问取消权限检查,暴力访问
field.setAccessible(true);
Object obj = clazz.newInstance();
field.set(obj, 20);
Object o = field.get(obj);
System.out.println(o);

获取方法

  • 获取所有方法
Class clazz = Class.forName("com.abc.Person");
Method[] methods  = clazz.getMethods(); //获取的都是公有的方法。 
//methods = clazz.getDeclaredMethods(); //只获取本类中所有方法,包含私有 
for(Method method : methods){
	System.out.println(method);
}
  • 调用无参方法
Class clazz = Class.forName("com.abc.Person");
Method method = clazz.getMethod("show", null); //获取空参数一般方法。
//Object obj = clazz.newInstance();
Constructor constructor = clazz.getConstructor(String.class, int.class);
Object obj = constructor.newInstance("name", 10);
method.invoke(obj, null);
  • 调用有参方法
Class clazz = Class.forName("com.abc.Person");
Method method = clazz.getMethod("show", String.class, int.class);
Object obj = clazz.newInstance();
method.invoke(obj, "name", 20);
原文地址:https://www.cnblogs.com/cj5785/p/10664828.html